在bash别名文件中使用引号转义字符串
我想在我的~/.bash_aliases
文件中放入以下命令:
grep screen /var/log/auth.log|grep "$(date|awk '{print $2" "$3}')"
我试过把以下内容放在别名文件中:
alias unlocks=grep screen /var/log/auth.log|grep "$(date|awk '{print $2" "$3}')"
但我得到以下内容:
bash:别名:屏幕:找不到
bash:别名:/var/log/auth.log:未找到
据推测,这是因为命令字符串中的空格,这通常会通过引用整个字符串来解决,但我已经使用了两种引号,并且我无法解决如何正确转义它们。
请有人可以帮忙吗?
alias foo="my command with"quotes""
应该大部分时间都有效
编辑:由于bash
将评估字符串,您还需要转义其他特殊字符,如$
在你的情况: alias unlock="grep screen /var/log/auth.log|grep "$(date|awk '{print $2" "$3}')""
应该做的伎俩。
不要试图制造一些复杂的别名。 而是在.bashrc
定义一个函数。
unlocks () {
grep screen /var/log/auth.log | grep "$(date +"%b %d")"
}
另外,当你可以直接调整date
的输出时,不要使用awk
。 但是,您可以使用awk
替换grep
两个实例:
unlocks () {
awk -v date=$(date +"%b %d") '/screen/ && $0 ~ date' /var/log/auth.log
}
有一个简单的方法和一个困难的方法。
简单的方法是:将代码放入$HOME/bin
文件夹内的名为unlocks
的脚本文件中。 在大多数系统中,该文件夹被添加到路径中。 使用chmod +x $HOME/bin/unlocks
来使脚本可执行。
困难的方法:你可以使用嵌套引号,但它很丑,很脆弱......我不推荐它。 但是,如果你必须的话,它会是这样的:
alias unlocks='grep screen /var/log/auth.log|grep "$(date|awk '"'"'{print $2" "$3}'"'"')"'
要在一个单引号字符串中获得单个嵌套单引号,您需要'"'"'
第一个勾号结束当前字符串。 "'"
给你一个单引号,shell会追加当前字符串。 最后一个滴答然后继续字符串。
alias unlocks="..."
在这种情况下不起作用,因为它会立即运行date|awk '{print $2" "$3}'
并将结果放入别名中。
上一篇: Escaping a string with quotes in bash alias file
下一篇: How do I reload .bashrc without logging out and back in?