讓我們想象一下,我們有這樣的代碼(script.sh
):習慣的方法
#!/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)
輸出:
$ bash myscript.sh
[f] Start
[f] Fail! I don't want this executed
我明白$(...)
啓動子shell set -e
沒有傳播,所以我的問題是:什麼是使這個運行如預期沒有太多混亂的慣用方法?我可以看到3種解決方案,我都不喜歡這些解決方案(但我確實無法確定它們確實可行):1)將set -e
添加到f
(以及該應用中的所有其他功能)的開頭。 2)運行$(set -e && f)
。 3)將... || return 1
添加到每個可能失敗的命令。
選項3實際上是一個[好主意](http://mywiki.wooledge.org/BashFAQ/105)。 – chepner
@chepner:很好閱讀。 'cmd ||返回1'是明確的,概念上沒問題,但這麼麻煩...... – tokland