Csh alias with perl one liner在创建别名时进行计算,而不是在使用别名时进行计算

Csh alias with perl one liner在创建别名时进行计算,而不是在使用别名时进行计算,perl,alias,csh,Perl,Alias,Csh,我知道,我知道,我应该用一个现代的贝壳。。。总之,这里是别名: alias p4client echo `p4 info | perl -ne 's/Client name: (.*)$/print $1/e'` 我还知道可能有更好的方法获取p4客户机名称。这只是一个例子。那么,有谁能告诉我一种简单明了的方法,在我调用别名时计算它,而不是在创建别名时计算它呢?别名值需要被引用,因为它包含特殊字符。试试这个: alias p4client "echo "\`"p4 info | perl

我知道,我知道,我应该用一个现代的贝壳。。。总之,这里是别名:

  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'"\`
天哪,csh是世界上最糟糕的外壳。它的引用规则很糟糕。我绞尽脑汁想弄明白这一点,现在我已经没有精力解释了。对不起,我有动脉瘤

编辑1:瞧,你珍贵的美元符号
$
已经变成了这个怪物<代码>'\'\$'

编辑2:好的,我开始恢复。我的力量随着我在心爱的巴什甜蜜拥抱中度过的每一刻而回归。走开,csh,你这个肮脏的野兽

这件事之所以如此丑陋,是因为整件事必须双倍逃脱。一次是将美元符号传递给perl,另一次是将它们安全地传递给alias语句。如果有帮助,目标是使别名看起来像这样:

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

出现“\$”序列的原因是csh无法在双引号内转义美元符号。你不能在前面加反斜杠。实际上,您必须暂时关闭引号,在引号外使用
\$
,然后重新打开引号。

唯一的技巧是反斜杠转义单引号,并用单引号包围其他所有内容:

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'"

这里除了没有一个=after p4client之外,与您在bash中的操作方式没有什么不同。

+1:这已经够可怕了,我会创建一个(一行,bash)shell脚本来完成这项工作,只是为了避免必须经过“元语法动物园”,这是C shell的引用机制。我希望动脉瘤很快痊愈!您的一些麻烦是尝试将外部引号设置为双引号,而不是为团队设置单引号。:-)我打赌你已经看过了,但以防万一:哇,漂亮,简单,解释得很好!我希望你的老板给你很好的报酬,因为你是个摇滚明星。谢谢
alias p4client "p4 info | perl -ne 'print /Client name: (.*)/s'"