【问题标题】:Bash variable piping not working within an alias?Bash变量管道在别名中不起作用?
【发布时间】:2014-09-17 15:41:57
【问题描述】:

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

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

【问题讨论】:

  • pkill -9 memcached 有什么问题?
  • 顺便说一句,-9 / SIGKILL 是一种特别令人不快的杀死进程的方法,它不会给它自己清理的机会。也许你真的需要它,但这只是你友好的 PSA,先试试SIGTERM
  • 一般来说,当某些东西不能以你想要的方式使用别名时,“使用一个函数来代替”是一个很好的答案。 die_memcached_die() { ps -ef | ... | xargs kill; }
  • ...另外,考虑附议“使用 pkill 代替”建议。此外,您应该首先考虑使用 SIGTERM - 如果您使用的是良好的流程监督系统,其中许多将自动执行使用 SIGTERM 的过程,等待可配置的超时,然后仅在需要时使用 SIGKILL。
  • 感谢 pkill 的提醒;不知道那个。至于-9;我知道这不是杀死进程的“好”方法。如果我想让进程清理,我在别名中使用 die_ 来表示我正在使用 -9 或 surr_ 或投降。这也不是我要推广到生产服务器的东西,而只是我在本地使用的方便别名,以便在漫长的一天开发过程中节省一些打字时间:)

标签: linux bash shell awk


【解决方案1】:

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

【讨论】:

  • 谢谢;我切换到 pkill 因为我不熟悉它并且它更短,但这有效并回答了我所说的问题。
【解决方案2】:

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

你的别名应该是这样的:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多