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 退出。这意味着您将需要使用不同的工具。也许像 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符左侧的 , 命令不会导致 shell 退出,因此您可以通过添加 来抑制错误。&&|||| true

因此,0无论找到哪个进程,都应该输出(并且在输出之前不退出):

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

相关内容