pgrep -f wird mit 1 beendet.

pgrep -f wird mit 1 beendet.
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 pgrepvon Folgendes in :procps-ngman 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: pgrepwird 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 -eBefehlen 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 0unabhängig von den gefundenen Prozessen erfolgen (und nicht vor der Ausgabe beendet werden):

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

verwandte Informationen