
RUNNING_APPS=$(pgrep -f "somePattern")
echo $?
#results in
1
Wie kann ich dafür sorgen, dass mein Befehl mit dem Exitcode 0 durchkommt?
Antwort1
Auf meinem Arch-System sehe ich mit dem pgrep
von Folgendes in :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.
So ist es nun einmal: pgrep
wird mit 1 beendet, wenn alles gut geklappt hat, aber keine Prozesse gefunden wurden, die mit dem Suchbegriff übereinstimmen. Das bedeutet, dass Sie ein anderes Tool verwenden müssen. Vielleicht etwas wie Kusalananda in den Kommentaren vorgeschlagen hat undilkkachu hat als Antwort gepostet:
running_apps=$(pgrep -f "somePattern" || exit 0)
Aber meiner Meinung nach wäre es besser, Ihr Skript zu ändern. Und anstatt zu verwenden set -e
, lassen Sie es bei den wichtigen Schritten manuell beenden. Dann können Sie so etwas verwenden:
running_apps=$(pgrep -fc "somePattern")
if [ "$running_apps" = 0 ]; then
echo "none found"
else
echo "$running_apps running apps"
fi
Antwort2
Bei set -e
Befehlen auf der linken Seite der Operatoren AND ( &&
) oder OR ( ||
) kommt es nicht zum Beenden der Shell, daher können Sie den Fehler durch Hinzufügen unterdrücken || true
.
Daher sollte die folgende Ausgabe 0
unabhängig von den gefundenen Prozessen erfolgen (und nicht vor der Ausgabe beendet werden):
set -e
RUNNING_APPS=$(pgrep -f "somePattern" || true)
echo $?