pgrep -f sai com 1

pgrep -f sai com 1
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 pgrepfrom 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: pgrepsairá 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 0independentemente dos processos encontrados (e não sair antes de ser gerado):

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

informação relacionada