我已经在 bash 版本 4.1.2 和 4.4.2.0 上进行了测试。 在下面的代码中,最后一个 i 值将为 4。 为什么在'if'语句中调用f4()时'false'命令没有停止?
#!/bin/bash
set -ex
i=0
f4() {
i=$((i+1))
echo "in f4 before false, i=$i"
false
i=$((i+2))
echo "in f4 after false, i=$i"
}
if f4 ; then
echo "f4 pass, i=$i"
fi
f4
这个脚本的输出
+ i=0
+ f4
+ i=1
+ echo 'in f4 before false, i=1'
in f4 before false, i=1
+ false
+ i=3
+ echo 'in f4 after false, i=3'
in f4 after false, i=3
+ echo 'f4 pass, i=3'
f4 pass, i=3
+ f4
+ i=4
+ echo 'in f4 before false, i=4'
in f4 before false, i=4
+ false
我期待的是
+ i=0
+ f4
+ i=1
+ echo 'in f4 before false, i=1'
in f4 before false, i=1
+ false
+ f4
+ i=2
+ echo 'in f4 before false, i=2'
in f4 before false, i=2
+ false
因此,这种行为意味着如果我们编写一个函数,'set -e' 可能会通过不同的方法调用该函数来改变其行为。