在 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
}
我想将以下命令放入我的 ~/.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
}