为什么 `source foo && true` 在 bash 中退出脚本?

为什么 `source foo && true` 在 bash 中退出脚本?

所以,我读过这个: 带有 `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为标准。

相关内容