Bash变量管道在别名中不起作用



我尝试在.bash_profile.中创建以下内容作为别名

alias die_memcached_die="ps -ef | awk '/memcached/ && !/awk/ {print $2}' | xargs kill -9"

如果我直接在终端上运行命令,效果会很好

ps -ef | awk '/memcached/ && !/awk/ {print $2}' | xargs kill -9

或者如果我创建了一个bash脚本来运行它。

只是好奇为什么这在别名中不起作用?

问题是,您将别名定义用双引号括起来,因此shell会立即展开$2,而您的awk脚本并不是您所期望的。

$ cat aa
alias die_memcached_die="ps -ef | awk '/memcached/ && !/awk/ {print $2}' | xargs kill -9"
echo 'Alias command run is:'
echo 'alias die_memcached_die="ps -ef | awk '''/memcached/ && !/awk/ {print $2}''' | xargs kill -9"'
echo 'Alias actually is:'
alias die_memcached_die
alias die_memcached_die='ps -ef | awk '''/memcached/ && !/awk/ {print $2}''' | xargs kill -9'
echo 'Alias actually is:'
alias die_memcached_die
$ /bin/bash aa
Alias command run is:
alias die_memcached_die="ps -ef | awk '/memcached/ && !/awk/ {print $2}' | xargs kill -9"
Alias actually is:
alias die_memcached_die='ps -ef | awk '''/memcached/ && !/awk/ {print }''' | xargs kill -9'
Alias actually is:
alias die_memcached_die='ps -ef | awk '''/memcached/ && !/awk/ {print $2}''' | xargs kill -9'

话虽如此,OP上关于这是一个糟糕的别名和一个糟糕想法的评论都是正确的。

别名应该用单引号括起来,以防止shell插入前面有$的变量。

你应该有你的别名像:

alias die_memcached_die='ps -ef | awk "/memcached/ && !/awk/ {print $2}" | xargs kill -9'

您可以在单引号中包含awk定义,但需要确保转义它们。

此外,还要看一下函数。与别名相比,它们提供了更好的可扩展性和可靠性。

最新更新