bashスクリプトの変数にpgrep出力を正しく割り当てることができないのはなぜですか?

bashスクリプトの変数にpgrep出力を正しく割り当てることができないのはなぜですか?

実行中にcomptonを終了するか、実行していない場合は起動するスクリプトを作成しようとします。私はプロセスが見つかったら1を終了する必要があることを読んだので、それを使用するスクリプトを作成しようとしましたが、それはうまくいかず、閉じると起動しますが閉じません。私は何が間違っていましたか? ?

#!/bin/bash


status=$(pgrep compton 2>&1)

if [[ $status == 1 ]];
    then
        killall compton
    else
        exec compton -b
fi

echo $status

ベストアンサー1

あなたはいpgrep変数として出力を取得しますstatus。これは期待した結果ではありません。

pgrep指定したパターンに一致するプロセスのプロセスID(PID)を印刷します。名前が一致するプロセスがある場合は、そのプロセスのPIDになります compton。終了ステータスも返されますが、コマンド置換は終了ステータスを文字列としてキャプチャしません。$statuspgrep

テストではと$status比較します1。 PIDがcompton1の可能性はほとんどありません。


compton既存のプロセスを終了してcompton -bプロセスがない場合は、compton次のように起動できます。

#!/bin/sh

if ! pkill compton; then
    exec compton -b
fi

これは終了ステータスを使用しますpkill。このツールは(通常はペアとして展開およびインストールされています)同じようにpkill機能しますが、以前と同じように一致するプロセスのPIDを出力するのではなく、デフォルトで一致するプロセスにシグナルを送信します。pgreppgreppkillTERM

このifキーワードは、一緒に使用されるコマンドの終了状態を使用します。

!テストの意味を裏返して

  • 成功すると、pkill compton次があることを意味します。以前は1 つ以上のcomptonプロセスが終了したか、少なくとも信号を受信したため、exec compton -b実行されません。

  • 失敗した場合pkill compton(名前と一致するプロセスがない場合、または内部エラーがある場合pkill)、ステートメント本文はifyoursを呼び出してexec compton -bシェルプロセスを実行して生成されたプロセスに置き換えますcompton -b

おすすめ記事