.bashrc
我用于日志的文件中有以下内容:
function log(){
RED="\e[0;31m"
RESET="\e[0m"
echo -e "${RED}$(date)" "${RESET}$*" >> "$HOME"/mylog.txt
}
但是,当我执行带有撇号的操作时,它会出现某种提示,并且不会正确记录。
如何转义输入到文件中的所有文本?
例子:
$ log this is a testing's post
> hello
>
> ^C
$
谢谢。
答案1
echo -e
您遇到的问题与您的log()
职能无关。问题在于撇号:
log this is a testing's post
shell(在你的例子中是 bash)对于某些字符具有特殊含义。撇号(单引号)用于引用整个字符串,并防止大多数其他类型的插值。bash 希望它们成对出现,这就是为什么您会收到额外的提示行,直到您键入第二个提示行。如果你想在字符串中使用单引号,你需要通过 转义它来告诉 bash,\'
如下所示:
log this is a testing\'s post
再说一次,log
这不是重点。echo
如果你愿意的话,你可以用普通的旧方式尝试一下:
echo this is a testing\'s post
看bash中哪些字符需要转义了解更多信息。
答案2
您的问题是因为您输入的命令行包含不匹配的单引号字符。与 无关echo
。 shell 发出第二个提示,让您知道它正在等待由以下字符开头的单引号字符串的结尾's po...
'
如果您希望将其随意传递给函数,则需要转义log
:
log "this is a testing's post"
或者:
log this is a testing\'s post
例如。
现在,您需要的地方逃脱字符 fromecho -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
}
(此处使用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
}
请注意, 的扩展"$*"
取决于 的当前值$IFS
。
任何状况之下,最好避免echo
任意数据。