
RUNNING_APPS=$(pgrep -f "somePattern")
echo $?
#results in
1
Как мне сделать так, чтобы моя команда прошла с кодом выхода 0?
решение1
В моей системе Arch с помощью pgrep
from 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 $?