如何在启动时阻止 .bashrc 在别名中运行子命令?

Muh*_*hir 9 shell bash alias quoting

我添加了一个别名命令来杀死我的guake终端到我的.bashrc

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"
Run Code Online (Sandbox Code Playgroud)

但是问题是,子命令ieps aux | grep guake | head -n -1 | awk '{print $2}'是在终端启动的时候执行的,killguake设置为kill -9 result_of_subcommand.

有没有办法设置它,每次运行时都会运行/计算子命令killguake?这样它就可以拥有guake的最新PID。

我也曾尝试管道的kill使用xargs,但也导致相同的,那就是计算在启动时的一切。这是我用管道尝试过的

ps aux | grep guake | head -n -1 | awk '{print $2}' | xargs -I{} kill -9 {}
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 23

使用pkill来代替:

alias killguake='pkill guake'
Run Code Online (Sandbox Code Playgroud)

这比尝试解析由ps.

话虽如此,我现在将解释为什么您的别名不能满足您的要求,但实际上,使用pkill.

你的别名

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"
Run Code Online (Sandbox Code Playgroud)

是双引号。这意味着当 shell 解析 shell 初始化脚本中的那一行时,它将执行命令替换 ( $( ... ))。所以每次文件运行guake时,它不会给你一个别名在以后杀死,而是给你一个别名来杀死现在guake正在运行的进程。

如果你列出你的别名(with alias),你会看到这个别名类似于

killguake='kill -9 91273'
Run Code Online (Sandbox Code Playgroud)

或者甚至可能只是

killquake='kill -9'
Run Code Online (Sandbox Code Playgroud)

如果guake在 shell 启动时没有运行。

要解决此问题(但实际上,只需使用pkill),您需要使用单引号并将$awk 脚本中的转义(现在是双引号):

alias killguake='kill -9 $(ps aux | grep guake | head -n -1 | awk "{print \$2}")'
Run Code Online (Sandbox Code Playgroud)

一个与一般这种做法的问题是,你会匹配属于其他用户的进程。另一个是您可能只会找到grep guake命令而不是预期的过程。另一个是如果没有找到进程,它将抛出错误。另一个是您正在调用五个外部实用程序来完成一个工作。

  • @MuhammadTahir 真的不要使用这种方法。我只是提到了什么是错误的,以便您可以学到一些东西。永远不要尝试解析 `ps` 的输出来查找进程!!我是认真的。在任何情况下,您都不需要这样做! (2认同)

Ipo*_*cer 6

使用 pkill,不要重新发明轮子!

alias killguake="pkill -9 guake"
Run Code Online (Sandbox Code Playgroud)