Rohr B nach D? - A && B || C | D

Rohr B nach D? - A && B || C | D

Gibt es eine Möglichkeit, die Befehlsstruktur so umzuschreiben, A && B || C | Ddass entweder B oder C nach D weitergeleitet wird?

Mit dem aktuellen Befehl werden entweder nur B oder C und D gleichzeitig ausgeführt.

Zum Beispiel:

Bildbeschreibung hier eingeben

Antwort1

Ja, in Bash können Sie Klammern verwenden:

(A && B || C) | D

A && B || CAuf diese Weise wird die Ausgabe von in weitergeleitet D.

Antwort2

Sie können dies wie folgt schreiben:

if A; then B; else C; fi | D

Sie sagen, Sie möchten entweder Boder ausführen C, erreichen dies aber A && B || Cnicht. Wenn Aes erfolgreich ist, aber Bausgeführt wird und fehlschlägt, würde es ausgeführt werden C.

Anmerkung 1: Wenn Sie irgendwie garantieren können, dass das Bimmer gelingt und bei einer Kurzversion bleiben möchten, dann würde ich mich trotzdem für

{ A && B || C; } | D

über ( ... ), da letzteres unnötigerweise die Erstellung einer neuen Unterschale erzwingt, die möglicherweise durch Optimierung beseitigt wird oder nicht.

Hinweis 2: Beide Formen gehen davon aus, dass Akeine Ausgabe erzeugt wird, was in Ihrem Beispiel zutrifft, aber nicht unbedingt im Allgemeinen. Dies kann vermieden werden durch

A; if [ "$?" -eq 0 ]; then B; else C; fi | D

Antwort3

Die Antwort des Akzeptanten ist korrekt, deckt aber nicht den möglichen Anwendungsfall ab.nichthaben Sie die Ausgabe von Aals Eingabe von D. Um das zu erreichen, benötigen Sie Aje nach Bedarf eine Stream-Umleitung auf .

  • Wenn Sie die Ausgabe trotzdem verwerfen möchten A:

    { A >/dev/null && B || C; } | D
    
  • AWenn Sie die Ausgabe auf dem Terminal sehen möchten :

    { A >/dev/tty && B || C; } | D
    
  • Wenn Sie die Ausgabe Aals Eingabe eines nachfolgenden Befehls benötigen E, brauchen Sie eine zusätzliche Befehlsgruppe und eine Stream-Umleitung:

    { { A >&3 && B || C; } | D; } 3>&1 | E
    

Wenn Ihnen das alles zu kompliziert erscheint (wie mir), empfehle ich Ihnen, die spezielle Shell-Variable für den Beendigungsstatus zu verwenden Aund damit zu arbeiten:

A
if [ $? -eq 0 ]; then
  B
else
  C
fi |
D

Wenn Sie es präziser, aber nicht zu geheimnisvoll ausdrücken möchten, schlage ich Folgendes vor:

A; { [ $? -eq 0 ] && B || C; } | D

(Siehe auch den letzten Teil vonhvds Antwortwas mir nicht aufgefallen ist, als ich meine ursprüngliche Antwort geschrieben habe.)

verwandte Informationen