Pro*_*iat 2 bash echo quoting escape-characters
我.bashrc用于日志的文件中有以下内容:
function log(){
RED="\e[0;31m"
RESET="\e[0m"
echo -e "${RED}$(date)" "${RESET}$*" >> "$HOME"/mylog.txt
}
Run Code Online (Sandbox Code Playgroud)
但是当我做一些带有撇号的事情时,它会出现某种提示并且没有正确记录它。
如何转义输入到文件中的所有文本?
例子:
$ log this is a testing's post
> hello
>
> ^C
$
Run Code Online (Sandbox Code Playgroud)
谢谢。
您遇到的问题与echo -e您的log()功能无关。问题在于撇号:
log this is a testing's post
外壳(在您的情况下为 bash)对某些字符具有特殊含义。撇号(单引号)用于引用整个字符串,并防止大多数其他类型的插值。bash 期望它们成对出现,这就是为什么在您键入第二个之前会得到额外的提示行的原因。如果您想在字符串中使用文字单引号,则需要通过 将其转义来告诉 bash \',如下所示:
log this is a testing\'s post
Run Code Online (Sandbox Code Playgroud)
再次,log是题外话。echo如果你愿意,你可以用普通的旧来试试这个:
echo this is a testing\'s post
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅需要在 bash 中转义哪些字符。
您的问题是因为您输入的命令行包含不匹配的单引号字符。它与echo. shell 发出一个辅助提示,让您知道它正在等待由以下内容开始的单引号字符串的结尾's po...
'如果您希望将其直接传递给log函数,则需要转义:
log "this is a testing's post"
Run Code Online (Sandbox Code Playgroud)
或者:
log this is a testing\'s post
Run Code Online (Sandbox Code Playgroud)
例如。
现在,您需要从中转义字符的地方echo -e是反斜杠字符。例如,如果您将其称为log '\begin',那么\b它将被转换为 BS 字符echo -e。
为了解决这个问题,要么存储带有\e在这些变量中扩展的转义序列:
log() {
RED=$'\e[0;31m'
RESET=$'\e[0m'
printf '%s\n' "${RED}$(date) ${RESET}$*" >> "$HOME"/mylog.txt
}
Run Code Online (Sandbox Code Playgroud)
(这里使用bash, ksh93, mksh,zsh或 FreeBSDsh语法来表示尚未使用的 POSIX$'...'语法)。
或者使用以下语法:
log() {
RED='\e[0;31m'
RESET='\e[0m'
printf '%b%s%b %s\n' "$RED" "$(date)" "$RESET" "$*" >> "$HOME"/mylog.txt
}
Run Code Online (Sandbox Code Playgroud)
请注意, 的扩展"$*"取决于 的当前值$IFS。
无论如何,最好避免echo使用任意数据。
| 归档时间: |
|
| 查看次数: |
4224 次 |
| 最近记录: |