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

时间:2014-09-17 15:41:58

标签: linux bash shell awk

我尝试在.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脚本来运行它。

只是好奇为什么这不能用于别名?

2 个答案:

答案 0 :(得分:5)

问题在于您将别名定义用双引号括起来,因此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的两个评论都是关于这是一个糟糕的别名和一个糟糕的想法是正确的。

答案 1 :(得分:4)

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

你应该有你的别名:

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

您可以在单引号内定义awk,但是您需要确保将它们转义。

另外,也看看功能。它们提供了比别名更好的可扩展性和可靠性。