使用perl one-liner的Csh别名在创建别名时评估,而不是在使用别名时评估

时间:2010-08-26 02:54:58

标签: perl alias csh

我知道,我知道,我应该使用一个现代的shell ...无论如何,所以这里是别名:

  alias p4client echo `p4 info | perl -ne 's/Client name: (.*)$/print $1/e'` 

我也知道可能有更好的方法来获取p4客户端名称。这只是一个例子。那么,当我调用别名而不是评估别名何时被创建时,有人能告诉我一个很好而且干净的方法来评估这个吗?

2 个答案:

答案 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无法在双引号内转义美元符号。你不能只在前面放一个反斜杠。您实际上必须暂时关闭引号,在引号之外使用\$ ,然后重新打开引号。