我添加了一个别名命令来终止我的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'
如果guake
shell 启动时没有运行。
为了解决这个问题(但实际上,只需使用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"