我知道,我知道,我应该使用现代外壳......无论如何,这是别名:
alias p4client echo `p4 info | perl -ne 's/Client name: (.*)$/print $1/e'`
我也知道可能有更好的方法来获取 p4 客户端名称。这只是一个例子。那么,任何人都可以告诉我一个很好且干净的方法来让这个在我调用别名而不是在创建别名时进行评估时对其进行评估?
唯一的技巧是反斜杠转义单引号并用单引号包围其他所有内容:
alias p4client 'echo `p4 info | perl -ne '\''s/Client name: (.*)$/print $1/e'\''`'
虽然 perl 可以简化:
alias p4client 'echo `p4 info | perl -ne '\''print /Client name: (.*)/'\''`'
并且 echo 和 `` 是说捕获这些命令打印并打印的输出;只需打印输出(仅让 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 中的操作没有什么不同。
别名值需要被引用,因为它包含特殊字符。试试这个:
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 无法在双引号内转义美元符号。你不能只在前面放一个反斜杠。您实际上必须暂时关闭引号,在引号\$
之外使用,然后重新打开引号。