我知道,我知道,我应该使用一个现代的shell ...无论如何,所以这里是别名:
alias p4client echo `p4 info | perl -ne 's/Client name: (.*)$/print $1/e'`
我也知道可能有更好的方法来获取p4客户端名称。这只是一个例子。那么,当我调用别名而不是评估别名何时被创建时,有人能告诉我一个很好而且干净的方法来评估这个吗?
答案 0 :(得分:7)
唯一的技巧是反斜杠转义单引号并用单引号包围其他所有内容:
alias p4client 'echo `p4 info | perl -ne '\''s/Client name: (.*)$/print $1/e'\''`'
虽然perl可以简化:
alias p4client 'echo `p4 info | perl -ne '\''print /Client name: (.*)/'\''`'
并且回声和``说捕获输出这些命令打印并打印它;只是打印输出(只有perl包含换行而不是从p4输出中剥离它只是让echo重新添加它):
alias p4client 'p4 info | perl -ne '\''print /Client name: (.*)/s'\'
虽然现在没有什么双引号不友好留在那里,所以:
alias p4client "p4 info | perl -ne 'print /Client name: (.*)/s'"
除了在p4client之后没有=时,你在bash中的表现没有什么不同。
答案 1 :(得分:3)
需要引用别名值,因为它包含特殊字符。试试这个:
alias p4client "echo "\`"p4 info | perl -ne 's/Client name: (.*)'\"\$"'/print '\"\$"'1/e'"\`
而神圣的废话,csh是世界上最糟糕的外壳。它的引用规则可怕。我融化了我的大脑试图想出这个,现在我没有精力去解释它。对不起,我有动脉瘤。
编辑1:看哪,你的宝贵美元符号$
已经变成了这个怪物! '\"\$"'
编辑2:好的,我开始恢复了。我的力量随着我在心爱的bash的甜蜜拥抱中度过的每一刻都回归。哎呀,csh,你这个怪兽!
这是如此丑陋的原因是因为整个事情必须双重逃脱。一旦将美元符号传递给perl,另一次让它们安全地通过别名声明。如果有帮助,目标是让别名看起来像这样:
% alias
4client echo `p4 info | perl -ne 's/Client name: (.*)'\$'/print '\$'1/e'`
'\$'
序列的原因是csh无法在双引号内转义美元符号。你不能只在前面放一个反斜杠。您实际上必须暂时关闭引号,在引号之外使用\$
,然后重新打开引号。