我在 tcsh 工作。如何为以下对象创建别名:
nc stop `nc list | awk '/Running/{print $1}'`
Run Code Online (Sandbox Code Playgroud)
我尝试了以下各种变体:
alias ncstop "nc stop `nc list | awk '/Running/{print $1}'`"
Run Code Online (Sandbox Code Playgroud)
但没有任何作用
您可以稍微更改一下引号,以便在使用别名之前不允许对反引号进行求值。
alias ncstop 'nc stop `nc list | awk '\''/Running/{print $1}'\''`'
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为当字符用于引用时, shell 不会解释'
诸如|
,$
和 the 之类的特殊字符。backtick
这允许这些特殊字符进入别名定义。但在定义别名的过程中,shell 删除了 's 的外层'
。别名定义中实际的结果应该是:
nc stop `nc list | awk '/Running/{print $1}'`
Run Code Online (Sandbox Code Playgroud)
该'\''
结构通常需要一些解释。但简而言之就是三个撇号。第一个结束前一个带引号的字符串,下一个(已转义以免被 shell 解释)通过,第三个开始另一个带引号的字符串。因此,该'\''
构造允许撇号(即:'
或single quote
)出现在单引号字符串内。
在需要遍历多层解释的字符串中正确获取所有引号和转义符很快就会变得混乱和复杂。对于这个问题,有一条评论建议 (for bash
) 考虑将别名实现为函数。我很确定同样可以建议tcsh
。