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
命令而不是预期的过程。另一个是如果没有找到进程,它将抛出错误。另一个是您正在调用五个外部实用程序来完成一个工作。