shell

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 when A 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 😉

Written on August 13, 2025