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

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

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

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

但问题是,子命令 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 {}

答案1

改用pkill

alias killguake='pkill guake'

这比尝试解析 . 输出的进程表要安全得多ps

话虽如此,我现在将解释为什么您的别名不能执行您想要的操作,但实际上,使用pkill

你的别名

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

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

如果您列出别名(带有alias),您会看到该别名类似于

killguake='kill -9 91273'

或者甚至可能只是

killquake='kill -9'

如果guakeshell 启动时没有运行。

为了解决这个问题(但实际上,只需使用pkill)您需要使用单引号并在 Awk 脚本中转义$(现在用双引号):

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

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

答案2

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

alias killguake="pkill -9 guake"

相关内容