Shell-trivia #3: set -e
Es gab bereits zwei Blog-Eintrag Shell-trivia #1 und Shell-trivia #2 zum Thema set -e
.
Mein Kollege N. Schier hat mich heute Morgen aber mit einer weiteren Shell-Absurdität überrascht:
#!/bin/sh
set -e
date && false && true
date
Wie häufig wird date
ausgeführt?
Wie üblich muss man die Manual-Page von bash sehr genau lesen:
The ERR trap is not executed if the failed command is … part of a command executed in a && or || list except the command following the final && or ||.
Die korrekte Antwort lautet also: 2
Beim date && false && true
Endet die Ausführung nach dem false
und der Exit-Code ist 1:
Das nachfolgende && …
wird nicht mehr ausgeführt.
Da das false
aber dadurch nicht der letzte Befehl ist, bricht set -e
nicht ab und das 2. date
wird trotzdem ausgeführt.
Das sollte man bedenken, wenn einem shellcheck folgende Warnungen ausspuckt und einen dazu anregen, mehr &&
zu benutzen:
- SC2015: Note that
A && B || C
is not if-then-else.C
may run whenA
is true. - SC2166: Prefer
[ p ] && [ q ]
as[ p -a q ]
is not well-defined.
Man baut sich dadurch leicht semantische Unterschiede ein.
Oder um es mit den Worten von G. Aschemann zu sagen:
Jedes gute Shell-Script fängt mit #!/usr/bin/perl an.
Naja, das war 1995 und ich würde perl
durch python
ersetzten 😉