pgrep -fは1で終了する

pgrep -fは1で終了する
RUNNING_APPS=$(pgrep -f "somePattern")
echo $?

#results in
1

終了コード 0 でコマンドを成功させるにはどうすればよいですか?

答え1

私の Arch システムでは、pgrepから を使用するとprocps-ng、 に次のメッセージが表示されますman pgrep:

EXIT STATUS
       0      One  or  more processes matched the criteria. For
              pkill the process must also  have  been  success‐
              fully signalled.
       1      No  processes  matched  or  none of them could be
              signalled.
       2      Syntax error in the command line.
       3      Fatal error: out of memory etc.

これが現状です。pgrepすべてが正常に動作したが、検索文字列に一致するプロセスがない場合は、1で終了します。つまり、別のツールを使用する必要があります。おそらく、Kusalanandaがコメントで提案したようなものやilkkachu が回答として投稿しました:

running_apps=$(pgrep -f "somePattern" || exit 0)

しかし、私の意見では、スクリプトを変更する方がよいと思います。 を使用する代わりにset -e、重要なステップで手動で終了するようにしてください。次に、次のようなものを使用できます。

running_apps=$(pgrep -fc "somePattern")
if [ "$running_apps" = 0 ]; then
    echo "none found"
else
    echo "$running_apps running apps"
fi

答え2

では、AND ( ) または OR ( ) 演算子set -eの左側にあるコマンドによってシェルが終了しないため、 を追加することでエラーを抑制できます。&&|||| true

したがって、0見つかったプロセスに関係なく出力する必要があります (出力前に終了しないでください)。

set -e
RUNNING_APPS=$(pgrep -f "somePattern" || true)
echo $?

関連情報