所以,我读过这个: 带有 `set -e` 的 Bash 脚本不会在 `... && ...` 命令上停止
这说得通。那么现在,问题是:
测试A:
$ cat ./test.sh
set -ex
source foo && true
echo 'running'
$ ./test.sh
++ source foo
./test.sh: line 16: foo: No such file or directory
$ echo $?
1
测试B:
$ cat ./test.sh
set -ex
cat foo && true
echo 'running'
$ ./test.sh
++ cat foo
cat: foo: No such file or directory
++ echo running
running
$ echo $?
0
为什么source
唯一违反这条规则(大胆的)?
如果失败的命令是紧随 while 或until 关键字之后的命令列表的一部分,是 if 或 elif 保留字之后的测试的一部分,则 shell 不会退出,在 && 或 || 中执行的任何命令的一部分列出最后 && 后面的命令除外或 ||,管道中除最后一个命令之外的任何命令,或者命令的返回值与 ! 反转。
答案1
source
是点命令的别名.
,点命令是所谓的special command
,其中 POSIX 描述这些命令在发生错误时退出整个非交互式 shell。
如果您通过以下方式调用命令:
bash test.sh
bash 不会退出,但是当您调用时:
bash -o posix test.sh
它退出了。因此,要么您的 bash 已默认编译为符合 POSIX 标准,要么您确实调用了与 bash 不同的 shell。
看http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14为标准。