Antwort1
Ja, in Bash können Sie Klammern verwenden:
(A && B || C) | D
A && B || C
Auf 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 B
oder ausführen C
, erreichen dies aber A && B || C
nicht. Wenn A
es erfolgreich ist, aber B
ausgeführt wird und fehlschlägt, würde es ausgeführt werden C
.
Anmerkung 1: Wenn Sie irgendwie garantieren können, dass das B
immer 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 A
keine 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 A
als Eingabe von D
. Um das zu erreichen, benötigen Sie A
je nach Bedarf eine Stream-Umleitung auf .
Wenn Sie die Ausgabe trotzdem verwerfen möchten
A
:{ A >/dev/null && B || C; } | D
A
Wenn Sie die Ausgabe auf dem Terminal sehen möchten :{ A >/dev/tty && B || C; } | D
Wenn Sie die Ausgabe
A
als Eingabe eines nachfolgenden Befehls benötigenE
, 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 A
und 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.)