Shell-trivia #1: set -e
Kleine Denksportaufgabe für den Morgen:
Was gibt folgendes Skript aus, d.h. was wird durch das set -e
als Fehler gewertet und führt zum Abbruch des Skripts:
#!/bin/sh
set -e
! false ; echo 0
! true ; echo 1
true && true ; echo 2
true || true ; echo 3
false && true ; echo 4
false || true ; echo 5
false && false ; echo 6
true || false ; echo 7
true && false ; echo 8
false || false ; echo 9
f () { false; echo 10; }
if f; then echo 11; else echo 12; fi
Hinweise aus man 1 bash
:
-e
- Exit immediately if a simple command (see SHELL GRAMMAR above) exits with a non-zero status.
- The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a
&&
or⎪⎪
list, or if the command’s return value is being inverted via!
. - Simple Commands
- A simple command is a sequence of optional variable assignments followed by blank-separated words and re-directions, and terminated by a control operator.
- Control operator
- A token that performs a control function.
- It is one of the following symbols:
|| & && ; ;; ( ) | <newline>
- …
- The control operators
&&
and⎪⎪
denote AND lists and OR lists, respectively. - An AND list has the form :
- command1 && command2 :
- command2 is executed if, and only if, command1 returns an exit status of zero. :
- An OR list has the form :
- command1 ⎪⎪ command2 :
- command2 is executed if and only if command1 returns a non-zero exit status.
- The return status of AND and OR lists is the exit status of the last command executed in the list.
man 1 sh
drückt es etwas präziser aus:
-e errexit
- If not interactive, exit immediately if any untested command fails.
- The exit status of a command is considered to be explicitly tested if the command is used to control an if, elif, while, or until; or if the command is the left hand operand of an
&&
or||
operator.
Written on October 19, 2015