在 bash 别名文件中用引号转义字符串

Escaping a string with quotes in bash alias file

我想将以下命令放入我的 ~/.bash_aliases 文件中:

grep screen /var/log/auth.log|grep "$(date|awk '{print " "}')"

我尝试将以下内容放入别名文件中:

alias unlocks=grep screen /var/log/auth.log|grep "$(date|awk '{print " "}')"

但我得到以下信息:

bash: alias: screen: not found

bash: alias: /var/log/auth.log: not found

据推测,这是因为命令字符串中的空格,通常可以通过引用整个字符串来解决,但我已经使用了两种类型的引号,我不知道如何转义它们正确。

有人可以帮忙吗?

alias foo="my command with\"quotes\"" 大部分时间应该都能正常工作

编辑:由于 bash 将评估字符串,您还需要转义其他特殊字符,例如 $

在您的情况下:alias unlock="grep screen /var/log/auth.log|grep \"$(date|awk '{print $2\" \"$3}')\"" 应该可以解决问题。

有简单的方法也有困难的方法。

简单的方法:将代码放入文件夹$HOME/bin 中名为unlocks 的脚本文件中。在大多数系统中,该文件夹被添加到路径中。使用 chmod +x $HOME/bin/unlocks 使脚本可执行。

困难的方法:您可以使用嵌套引号,但它丑陋、脆弱而且……我不推荐它。但如果必须的话,它看起来像这样:

alias unlocks='grep screen /var/log/auth.log|grep "$(date|awk '"'"'{print " "}'"'"')"'

要在单引号字符串中获得单个嵌套单引号,您需要 '"'"' 第一个刻度结束当前字符串。 "'" 给你一个单引号,shell 将附加当前字符串。最后一个刻度然后继续字符串。

alias unlocks="..."

在这种情况下不起作用,因为它会立即 运行 date|awk '{print " "}' 并将结果放入别名中。

不要尝试将如此复杂的东西设为别名。改为在 .bashrc 中定义一个函数。

unlocks () {
    grep screen /var/log/auth.log | grep "$(date +"%b %d")"
}

此外,当您可以直接调整 date 的输出时,请不要使用 awk。但是,您 可以 使用 awk 替换 grep:

的两个实例
unlocks () {
     awk -v date=$(date +"%b %d") '/screen/ && [=11=] ~ date' /var/log/auth.log
}