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, если все работает нормально, но не было процессов, соответствующих строке поиска. Это означает, что вам нужно будет использовать другой инструмент. Возможно, что-то вроде того, что предложил Кусалананда в комментариях и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

С помощью set -eкоманд, которые находятся слева от операторов AND ( &&) или OR ( ||), оболочка не завершает работу, поэтому вы можете подавить ошибку, добавив || true.

Таким образом, это должно вывести результат 0независимо от найденных процессов (и не завершить работу до вывода):

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

Связанный контент