Bash

使用帶有“killall”的萬用字元除了來自 /tmp 之外不起作用

  • August 3, 2021

我有/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)。

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