1

So, I've read this: Bash script with `set -e` doesn't stop on `... && ...` command

It makes sense. So now, the question:

Test 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

Test 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

Why is source uniquely violating this rule (bold)?

The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command's return value is being inverted with !.

vcardillo
  • 139

1 Answers1

5

source is an alias to the dot . command and the dot command is a so called special command where POSIX describes that these commands exit the whole non-interactive shell in case that an error occurs.

If you call your command via:

bash test.sh

bash does not exit, but when you call:

bash -o posix test.sh

it exits. So either your bash has been compiled to be POSIX compliant by default or you did call a different shell than bash.

See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14 for the standard.

Jeff Schaller
  • 67,283
  • 35
  • 116
  • 255
schily
  • 19,173
  • Spectacular, thank you! So interesting. I was scratching my head for a while on this one. – vcardillo Aug 21 '18 at 18:26
  • 2
    Bash, when called with a file called sh, enters posix mode. That is a third possibility and the one that apply here IMO (not compiled, nor other shell). –  Aug 23 '18 at 00:45