
RUNNING_APPS=$(pgrep -f "somePattern")
echo $?
#results in
1
Como posso fazer meu comando passar com o código de saída 0?
Responder1
No meu sistema Arch, com pgrep
from procps-ng
, vejo isso em 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.
Então é assim que as coisas são: pgrep
sairá com 1 se tudo funcionou bem, mas não houve processos correspondentes à string de pesquisa. Isso significa que você precisará usar uma ferramenta diferente. Talvez algo como Kusalananda sugeriu nos comentários eilkkachu postado como resposta:
running_apps=$(pgrep -f "somePattern" || exit 0)
Mas uma abordagem melhor, IMO, seria mudar seu roteiro. E em vez de usar set -e
, saia manualmente nas etapas importantes. Então, você pode usar algo assim:
running_apps=$(pgrep -fc "somePattern")
if [ "$running_apps" = 0 ]; then
echo "none found"
else
echo "$running_apps running apps"
fi
Responder2
Com set -e
, comandos que estão no lado esquerdo dos operadores AND ( &&
) ou OR ( ||
) não fazem com que o shell saia, então você pode suprimir o erro adicionando || true
.
Portanto, isso deve ser gerado 0
independentemente dos processos encontrados (e não sair antes de ser gerado):
set -e
RUNNING_APPS=$(pgrep -f "somePattern" || true)
echo $?