bashスクリプトで可変引数を使用して、正しいプロセス名をgrepします。

bashスクリプトで可変引数を使用して、正しいプロセス名をgrepします。

プロセス名を検索するbashスクリプトを作成しています。この名前は、スクリプトの実行時に使用されるパラメーターです。

ps -ef | grep [w]ord通常、フローを正しく作成するためにこれを行うことができます。 grep(here) の引数が[w]ord次の場合$1

例:

ps -ef | grep [f]fmpeg

次の行が表示されます。それがすべてです。

jan 117977 117966 0 20:07 pts/0 00:00:01 ffmpeg ..

スクリプトで同じ動作が必要で、スクリプトでパラメータをgrepパラメータに設定した場合:

ps -ef | grep "$1"

これを呼び出すと、./script.sh ffmpegffmpegプロセス(正しい)とgrepandbashプロセスが表示されます。

jan       117977  117966  0 20:07 pts/0    00:00:01 ffmpeg ..
jan       118566  117021  0 20:14 pts/4    00:00:00 bash ./script.sh ffmpeg
jan       118568  118566  0 20:14 pts/4    00:00:00 grep ffmpeg

出力の最後の2行には興味がありません。

答え1

ただ実行してください:

pgrep -fl script.sh

からman pgrep

pgrep、pkill、pidwait - 名前やその他の属性に基づいてプロセスを見つけ、シグナルを送信し、待機します。
-fパターン--full
は通常プロセス名とのみ一致します。 -fを設定すると、コマンドライン全体が使用されます。
-l--list-name
プロセス名とプロセスIDをリストします。 (pgrepのみ)。

答え2

これをサポートするシェルでは、部分文字列拡張を使用して角かっこを正しい位置に配置できます。

name=ffmpeg
ps -ef | grep "[${name:0:1}]${name:1}"

grep "[f]fmpeg"パイプの右側で実行されます。

(ほとんどの特殊文字は通常括弧内の特殊文字ではないため、比較的安全ですが、文字以外の他の文字は期待しません。)

それでもpgrep自動的に自分を無視する方法を知っているので、より良いです。すべての内容を印刷するわけではありませんが、ps次の内容が役に立ちます。

name=ffmpeg
ps -f -p $(pgrep "$name" |tr '\n' ',')

答え3

grepの逆マッチングは機能しますか?

grep -v 'grep\|script'

これはgrepまたはスクリプトと一致しません。

関連情報