Kurze Antwort
Schreiben
ps -ef | grep bar | { grep -v grep || test $? = 1; }
wenn Sie verwenden set -e
.
Wenn Sie die pipefail
Option ( set -o pipefail
) von bash verwenden , denken Sie daran, die Ausnahmebehandlung ( ||test
) auf alle Elemente grep
in 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
grep
Der 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
grep
kann 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 , test
dass bestimmte Exit - Status zu unterdrücken.
- Wenn
grep
zurückgegeben wird 0
, test
wird nicht ausgeführt.
- Wenn
grep
zurückgegeben wird 1
, test
wird ausgeführt und zurückgegeben 0
.
- Wenn
grep
ein anderer Wert zurückgegeben wird, test
wird ausgeführt und zurückgegeben 1
.
Im letzten Fall wird das Skript aufgrund von set -e
oder sofort beendet set -o pipefail
. Wenn Sie sich jedoch überhaupt nicht um grep
Fehler 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 grep
viel 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 -e
und zu verlieren set -o pipefail
:
ps -ef | c1grep bar | c1grep -v grep
Zu Ihrer Information:
- Ich habe es genannt, um
c1grep
zu betonen, dass es einfach den Exit-Status erreicht 1
, sonst nichts.
- Ich hätte
grep
stattdessen 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 grep
den | grep
Teil vermeiden oder gar vermeiden ps|grep
können, werfen Sie einen Blick auf einige der anderen Antworten. aber das ist imho etwas off-topic.
[1] grep
Manpage
set -e
nicht bash-spezifisch ist, sondern für jede POSIX-kompatible Shell (sh
usw.) gilt