我尝试将此别名添加到我的 .zshrc 但遇到错误。我尝试转义 ==、" 和 && 值,但仍然没有成功。我错过了什么?
alias broke="ssh -t [email protected] tail -f documents/dir/`date -u +%Y%m%d`.log | awk '$2=="ABC:" && int($5)>=26 || int($5)<=-26'"
答案1
- 您过早执行了命令替换,因为您的别名是使用双引号而不是单引号定义的,因此
date
当您的别名为定义的,不是在调用时; - 您的 shell 将您的
awk
字段引用解释为 shell 位置参数并且 - 正在扩大它们当你的别名被定义时;
awk
永远不会看到周围的双引号,ABC:
因此它被解释为未设置的awk
变量ABC
(即空字符串),后跟一个意外位置的不带引号的冒号,这可能会引发错误awk
;- 作为额外的建议,你应该真正使用
$(...)
而不是`...`
因为里面的引用规则更直观。
要设置包含命令替换和特殊字符的别名,您应该使用单引号进行设置。实际上,在使用别名时,您不会希望进行参数扩展。放而不是当它被调用时。
您不能在单引号内嵌入单引号,但这并不重要,因为引号本身不是分隔符:
alias hassinglequotesembedded='echo "It'\''s not really too hard; current date when the alias is executed is $(date)"; echo '"'but the alias was set at $(date)'"
强烈建议进一步阅读 Stack Overflow 上有关引用类型的内容:
答案2
如果您要经常运行此操作而需要别名,那么如果您执行以下操作,几乎肯定会更好:
将其编写为 shell 脚本 - 迷失在嵌套引号中的可能性要小得多。
scp
它到/usr/local/bin
远程服务器上(或路径中的其他位置)。或者一开始就把它写在那里。请记住使用 使其可执行chmod
。ssh
只需在需要时 运行脚本即可。 。如果需要,您甚至可以将其放入别名中:ssh -t [email protected] myscript
alias broke='ssh -t [email protected] myscript'
顺便说一句,使用$()
而不是反引号。 $()
更容易阅读,更容易嵌套而不会出现问题,并且不容易与单引号混淆。
答案3
对我来说这就像需要逃避$
角色一样简单
不工作:
alias trim="awk '{$1=$1};1';"
解决方案:
alias trim="awk '{\$1=\$1};1';"