Code: Alles auswählen
❯ false && echo "foo" ; echo "bar"
bar
Code: Alles auswählen
❯ false && echo "foo" ; echo "bar"
bar
Code: Alles auswählen
false && { echo "foo" ; echo "bar"; }
Code: Alles auswählen
false && echo "foo" && echo "bar"
Code: Alles auswählen
false && { echo "foo"; echo "bar"; }
Das hat allerdings noch ein leicht anderes Verhalten: Falls echo "foo" fehlschlüge, würde echo "bar" nicht mehr ausgeführt werden. In der Eingangsfrage war das etwas anders, da sollte echo "bar" unabhängig vom Erfolg von echo "foo" laufen.Livingston hat geschrieben:19.12.2023 12:43:27Eine Lösung wäre:Code: Alles auswählen
false && echo "foo" && echo "bar"
Wobei die beiden Beispiele aber logisch nicht identisch sind: Im 1. Beispiel wird `echo bar' nur ausgeführt, wenn `echo foo' erfolgreich war. Im 2. Beispiel wird `echo bar' immer nach einem `echo foo' ausgeführt.Livingston hat geschrieben:19.12.2023 12:43:27Das ";" lässt Dich nur Zeilensprünge einsparen. Du hättest Dein Beispiel also auch ohne Semikolon und in zwei Zeilen schreiben können. Eine Lösung wäre:oderCode: Alles auswählen
false && echo "foo" && echo "bar"
Code: Alles auswählen
false && { echo "foo"; echo "bar"; }
Code: Alles auswählen
tmux attach || tmux new
Code: Alles auswählen
tmux a || tmux
Was hier zum Tragen kommt, ist die unterschiedliche Wertigkeit der Operatoren && und ;: Operatorrangfolge (auf Englisch meist: operator precedence).uname hat geschrieben:19.12.2023 12:58:14Vielleicht etwas offtopic:
Ich bin von der Logik von && und || in Bash auch immer wieder begeistert. Leider hat mein privates Umfeld überhaupt kein Interesse an der Booleschen Algebra, Venn-Diagramme oder auch an die wahrheitsfunktionale Implikation (ist hier aber auch nicht relevant).
Code: Alles auswählen
{ false && echo "foo"; }; echo "bar"
Tss, immer noch vieeeel zu lang:
Code: Alles auswählen
tmux new -A
Code: Alles auswählen
$ false || echo "Oops, fail"
Oops, fail
$ true || echo "Will not be printed"
$
$ true && echo "Things went well"
Things went well
$ false && echo "Will not be printed"
$
$ false ; echo "This will always run"
This will always run
Ich finde, man kann die Frage in zwei Arten verstehen:nudgegoonies hat geschrieben:19.12.2023 12:26:38Ich hätte erwartet, dass nach dem false abgebrochen wird, aber er überspringt nur das foo und führ bar auf jeden Fall aus. Kann ich einen Abbruch nach dem ersten Fehler erzwingen, so wie bei -e in Scripten?
Nö, weil `A && B || C' kein if-then-else ist. C wird ausgeführt, wenn A oder B scheitert:Meillo hat geschrieben:19.12.2023 14:10:40Aber du kannst hinter ein `&& foo' noch ein `|| exit 1' haengen, das dann im gegenteiligen Fall ausgefuehrt wird.
Code: Alles auswählen
$ true && false || echo FALSE
FALSE
$ false && true || echo FALSE
FALSE
$
Hab da mal ne blöde Frage. Wieso schreibst du das ``Gegenteilig'' statt "Gegenteilig" oder 'Gegenteilig'
... weil das aus der Geschichte kommt. In Latex, troff und insbesondere m4 werden Quotes genau so genutzt. Mit einem passenden Font, der die historische Tradition wiedergibt, sieht das auch sinnvoll aus: http://marmaro.de/rem/texte/anfuehrungszeichen.png