在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}'并将结果放入别名中。

链接地址: http://www.djcxy.com/p/9799.html

上一篇: Escaping a string with quotes in bash alias file

下一篇: How do I reload .bashrc without logging out and back in?