wir uns vor, wir diesen Code haben (script.sh
):Idiomatic Weg Satz von Zwingen -e überall in einem Shell-Skript
#!/bin/bash
set -e
f() {
echo "[f] Start" >&2
echo "f:before-false1"
echo "f:before-false2"
false
echo "f:after-false"
echo "[f] Fail! I don't want this executed" >&2
}
out=$(f)
Der Ausgang:
$ bash myscript.sh
[f] Start
[f] Fail! I don't want this executed
Ich verstehe, dass $(...)
startet eine sub- Shell, wo set -e
nicht propagiert wird, so ist meine Frage: Was ist der idiomatische Weg, um diesen Lauf wie erwartet ohne zu viel Unordnung zu machen? Ich kann 3 Lösungen sehen, von denen ich keine mag (noch bin ich mir sicher, dass sie tatsächlich funktionieren): 1) Füge set -e
zum Start von f
hinzu (und jede andere Funktion in der App). 2) Führen Sie $(set -e && f)
. 3) Füge ... || return 1
zu jedem Befehl hinzu, der fehlschlagen kann.
Option 3 ist eigentlich eine [gute Idee] (http://mywiki.wooledge.org/BashFAQ/105). – chepner
@chepner: Gut gelesen. 'cmd || return 1' ist explizit und konzeptionell in Ordnung, aber so umständlich ... – tokland