Bash
如何在啟動時阻止 .bashrc 在別名中執行子命令?
我添加了一個別名命令來殺死我的
guake
終端到我的.bashrc
alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"
但問題是,子命令ie
ps 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 {}
改用
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
命令而不是預期的過程。另一個是如果沒有找到程序會拋出錯誤。另一個是您正在呼叫五個外部實用程序來完成其中一個的工作。