让我们想象一下,我们有这样的代码(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