Bash
使用帶有“killall”的萬用字元除了來自 /tmp 之外不起作用
我有
/tmp/bash.sh
一個包含這樣的腳本:killall name*
如果我去
/tmp
文件夾然後執行它工作正常./bash.sh
,但如果我去/
然後執行/tmp/bash.sh
或者./tmp/bash.sh
它不起作用。相反,它抱怨name*: no process found
為什麼?如何解決這個問題?
該
killall
實用程序不採用模式,它採用一個或多個程序名稱的列表來發送信號。當您說
killall name*
shell 會將不帶引號的文件名通配模式擴展name*
到目前目錄中與該模式匹配的所有文件名時,會發生什麼。您顯然有一些
/tmp
與此模式匹配的文件名,並且也對應於您想要殺死的程序。當沒有匹配的文件名時,例如係統上的目錄中似乎沒有文件名,/
您的 shell 會保留未擴展的模式。該killall
實用程序找不到任何被呼叫的程序name*
,並以您在問題中報告的方式抱怨。對於更符合您預期的實用程序,請考慮該
pkill
實用程序。有了它,您可以根據與其名稱匹配的擴展正則表達式向程序發出信號。以下將向
TERM
名稱以開頭的所有程序發送信號name
(請注意,通常應引用該模式):pkill '^name'
向名稱
name
完全匹配的程序發出信號:pkill '^name$'
或更好,
pkill -x name
還要考慮為程序提供的參數,請使用
-f
帶有 的選項pkill
,例如cat
通過鍵入來終止您啟動的命令cat myfile
:pkill -f -x 'cat myfile'
另請參閱
pkill
手冊 (man pkill
)。