pgrep -f は 1 で終了します。

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

#results in
1

コマンドパス終了コードを0にするにはどうすればよいですか?

答え1

私のArchシステムでは、pgrepfromを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で終了します。これは、さまざまなツールを使用する必要があることを意味します。おそらくKusalalanandaがコメントで提案したように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 $?

関連情報