Kurze Antwort
Schreiben
ps -ef | grep bar | { grep -v grep || test $? = 1; }
wenn Sie verwenden set -e.
Wenn Sie die pipefailOption ( set -o pipefail) von bash verwenden , denken Sie daran, die Ausnahmebehandlung ( ||test) auf alle Elemente grepin der Pipeline anzuwenden :
ps -ef | { grep bar || test $? = 1; } | { grep -v grep || test $? = 1; }
In Shell-Skripten empfehle ich Ihnen, die Dienstprogrammfunktion „catch-1-grep“ (c1grep) zu verwenden:
c1grep() { grep "$@" || test $? = 1; }
Erklärt
grepDer Exit-Status ist entweder 0, 1 oder 2: [1]
0 bedeutet, dass eine Linie ausgewählt ist
1 bedeutet, dass keine Linien ausgewählt wurden
2 bedeutet, dass ein Fehler aufgetreten ist
grepkann auch andere Codes zurückgeben, wenn diese durch ein Signal unterbrochen werden (z 130. B. für SIGINT).
Da wir nur Exit - Status ignorieren wollen 1, verwenden wir , testdass bestimmte Exit - Status zu unterdrücken.
- Wenn
grepzurückgegeben wird 0, testwird nicht ausgeführt.
- Wenn
grepzurückgegeben wird 1, testwird ausgeführt und zurückgegeben 0.
- Wenn
grepein anderer Wert zurückgegeben wird, testwird ausgeführt und zurückgegeben 1.
Im letzten Fall wird das Skript aufgrund von set -eoder sofort beendet set -o pipefail. Wenn Sie sich jedoch überhaupt nicht um grepFehler kümmern , können Sie natürlich schreiben
ps -ef | grep bar | { grep -v grep || true; }
wie von Sean vorgeschlagen .
[zusätzliche] Verwendung in Shell-Skripten
Wenn Sie in Shell-Skripten grepviel verwenden, empfehle ich Ihnen, eine Dienstprogrammfunktion zu definieren:
c1grep() { grep "$@" || test $? = 1; }
Auf diese Weise wird Ihre Pfeife wieder kurz und einfach, ohne die Funktionen von set -eund zu verlieren set -o pipefail:
ps -ef | c1grep bar | c1grep -v grep
Zu Ihrer Information:
- Ich habe es genannt, um
c1grepzu betonen, dass es einfach den Exit-Status erreicht 1, sonst nichts.
- Ich hätte
grepstattdessen die Funktion aufrufen können ( grep() { env grep "$@" ...; }), aber ich bevorzuge einen weniger verwirrenden und expliziteren Namen c1grep.
[zusätzlich] ps+grep
Wenn Sie also wissen möchten, wie Sie grep -v grepden | grepTeil vermeiden oder gar vermeiden ps|grepkönnen, werfen Sie einen Blick auf einige der anderen Antworten. aber das ist imho etwas off-topic.
[1] grepManpage
set -enicht bash-spezifisch ist, sondern für jede POSIX-kompatible Shell (shusw.) gilt