
RUNNING_APPS=$(pgrep -f "somePattern")
echo $?
#results in
1
¿Cómo puedo hacer que mi comando pase con el código de salida 0?
Respuesta1
En mi sistema Arch, con pgrep
from procps-ng
, veo esto en 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.
Entonces así es como es: pgrep
saldrá con 1 si todo funcionó bien pero no hubo procesos que coincidan con la cadena de búsqueda. Esto significa que necesitarás utilizar una herramienta diferente. Quizás algo como lo que Kusalananda sugirió en los comentarios yilkkachu publicado como respuesta:
running_apps=$(pgrep -f "somePattern" || exit 0)
Pero, en mi opinión, un mejor enfoque sería cambiar el guión. Y en lugar de usar set -e
, haga que salga manualmente en los pasos importantes. Entonces, puedes usar algo como esto:
running_apps=$(pgrep -fc "somePattern")
if [ "$running_apps" = 0 ]; then
echo "none found"
else
echo "$running_apps running apps"
fi
Respuesta2
Con set -e
los comandos que en el lado izquierdo de los operadores AND ( &&
) u OR ( ||
) no provocan que el shell se cierre, por lo que puede suprimir el error agregando || true
.
Por lo tanto, esto debería generarse 0
independientemente de los procesos encontrados (y no salir antes de generarlo):
set -e
RUNNING_APPS=$(pgrep -f "somePattern" || true)
echo $?