Was bringt es, die Ausgabe von grep nach / dev / null umzuleiten?

24

Betrachten Sie diese Zeile:

${libdir}/bin/licenseTool check "${SERIAL}" "${VERSION}" "${PRODUCT}" ${libdir} | grep '^200' >/dev/null

Was ist der Punkt , der in der Ausgabe für das Muster suchen , wenn das Ergebnis , dass weggeworfen?

Und wenn eine solche Zeile als letztes in einem Bash-Skript erscheint, wird der Exit-Wert an den Aufrufer des Skripts zurückgegeben oder ignoriert? (Ich spekuliere darüber, ob wir davon ausgehen können, dass dies nur für Nebenwirkungen erfolgt oder dem Anrufer irgendwie etwas zurückgibt.)

JDługosz
quelle

Antworten:

29

Ihr Verdacht ist richtig; Der Beendigungsstatus des letzten Befehls des Skripts wird an die aufrufende Umgebung übergeben. Die Antwort lautet also, dass dieses Skript einen Exit-Status 0 grepzurückgibt, wenn eine Übereinstimmung mit den Daten vorliegt, einen Exit-Status 1, wenn keine Übereinstimmung vorliegt, und einen Exit-Status 2, wenn ein Fehler aufgetreten ist.

Janis
quelle
27

Der Punkt der grepPing-Ausgabe, der weggeworfen wird, ist, dass der Schreiber nur den Rückgabestatus von möchte grep. Er möchte nur wissen, ob ein Muster übereinstimmt oder nicht. In Ihrem Fall wird zuletzt grepgeprüft, ob die Ausgabe des früheren Befehls Zeilen enthält, die mit beginnen 200.

In modernen POSIX-Systemen können Sie alles mit grep -q erledigen, ohne zu Folgendem umzuleiten /dev/null:

... | grep -q '^200'

Ein Hinweis, dass die Verwendung grep -qnur geringfügige Nebenwirkungen hat, ist Stéphane Chazelas zu verdanken , der in seinem Kommentar darauf hingewiesen hat. grep -qWird beendet, sobald das erste Match gefunden wurde, und wenn licenseToolnach dem grepBeenden noch etwas geschrieben wird , wird ein SIGPIPE ausgegeben.

cuonglm
quelle
2
und grep -q
verbraucht
5
Da diese Dinge gehen, grep -qwurde vor relativ kurzer Zeit hinzugefügt; > /dev/nullStattdessen werden immer noch viele Skripte verwendet, da dies alles war, was Sie in der Eiszeit (dh 1995) hatten.
zwol
3
Fehlt Ihrem ersten Satz ein Verb?
AL
Eine weitere Disäquivalenz zwischen "grep -q" und "grep> / dev / null" aus der GNU-Manpage: "Wenn jedoch" -q "oder" --quiet "oder" --silent "verwendet und eine Zeile ausgewählt wird, lautet der Beendigungsstatus 0, auch wenn ein Fehler aufgetreten ist. "
Mark
Wenn die Dokumentation korrekt ist "der Exit-Status ist 0, auch wenn ein Fehler aufgetreten ist" ... Ich denke, die -qOption scheint nicht angemessen zu sein ... weil Sie möchten, dass sie über den Fehler informiert wird, indem Sie den Exit-Status überprüfen.
Trevor Boyd Smith