Bash

如何在啟動時阻止 .bashrc 在別名中執行子命令?

  • January 17, 2017

我添加了一個別名命令來殺死我的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 {}

改用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命令而不是預期的過程。另一個是如果沒有找到程序會拋出錯誤。另一個是您正在呼叫五個外部實用程序來完成其中一個的工作。

引用自:https://unix.stackexchange.com/questions/337965