Gibt es eine Möglichkeit, die Befehlsstruktur neu zu schreiben, A && B || C | D
sodass entweder B oder C in D weitergeleitet werden?
Mit dem aktuellen Befehl werden entweder nur B oder sowohl C als auch D ausgeführt.
Beispielsweise:
Ja, in bash können Sie Klammern verwenden:
(A && B || C) | D
Auf diese Weise der Ausgang A && B || C
wird in geleitet werden D
.
A && (B || C) | D
wenn Sie nicht möchten, dass B, C oder D ausgeführt werden, wenn A ausfälltsh
:)A
sich in der Unterschale befindet, schließt dies auch einA
.)Sie können dies als schreiben
Du sagst, du willst entweder
B
oder laufenC
, aberA && B || C
das schaffst du nicht. Wenn diesA
gelingt, aber ausgeführt wirdB
und fehlschlägt, wird es ausgeführtC
.Hinweis 1: Wenn Sie irgendwie garantieren können, dass das
B
immer gelingt und Sie bei einer kurzen Version bleiben möchten, dann würde ich mich trotzdem dafür entscheidenüber
( ... )
, da letztere unnötigerweise die Erzeugung einer neuen Unterschale erzwingt, die möglicherweise wegoptimiert wird oder nicht.Anmerkung 2: Beide Formen gehen davon
A
aus, dass keine Ausgabe erfolgt, was in Ihrem Beispiel zutrifft, aber nicht unbedingt im Allgemeinen. Das kann vermieden werden durchquelle
{ … }
aufgrund der Pipe keine Unterschale erstellt werden muss? Ich beobachte folgendes Verhalten:pgrep bash
undpgrep bash | cat
undif true; then pgrep bash; fi
und{ pgrep bash; }
haben eine Ausgabezeile;( pgrep bash; )
und( pgrep bash; ) | cat
und{ pgrep bash; } | cat
undif true; then pgrep bash; fi | cat
haben zwei Ausgabezeilen.... | ...
bewirkt, dass eine Subshell erstellt wird, was unvermeidlich ist.( ... )
Zumindest theoretisch wird eine zusätzliche Subshell erstellt, die dies{ ...; }
vermeidet, aber das habe ich mit "kann oder kann nicht optimiert werden" gemeint: Es ist möglich, dass in diesem speziellen Fall die Shell merkt, dass es keine Rolle spielt, die Wirkung wäre das gleiche.Die accepter Antwort ist richtig , aber es ist nicht die mögliche Verwendung Fall Deckung nicht die Ausgabe haben
A
als EingangD
. Um dies zu erreichen, müssen SieA
je nach Bedarf eine Stream-Umleitung aktivieren.Wenn Sie die Ausgabe
A
trotzdem verwerfen möchten :Wenn Sie die Ausgabe von
A
auf dem Terminal sehen möchten :Wenn Sie die Ausgabe von
A
als Eingabe eines nachfolgenden BefehlsE
benötigen, benötigen Sie eine zusätzliche Befehlsgruppe und eine Stream-Umleitung:Wenn Ihnen das alles zu dunkel erscheint (wie mir), empfehle ich Ihnen, die spezielle Shell-Variable für den Exit-Status von zu verwenden
A
und damit zu arbeiten:Wenn Sie prägnanter, aber nicht zu geheimnisvoll sein möchten, empfehle ich Folgendes:
(Siehe auch den letzten Teil der Antwort von hvd, den ich nicht bemerkt habe, als ich meine ursprüngliche Antwort geschrieben habe.)
quelle
A
aus der Pipeline herausgezogen bin .