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 !.

  • 2
    Your first observation is wrong (test A), the sample code runs without failure. – Fólkvangr Aug 21 '18 at 6:11
  • You need to be more careful. You are running your scripts with sh not bash. – meuh Aug 21 '18 at 7:28
  • @Fólkvangr, it fails on Darwin, and on Linux. – vcardillo Aug 22 '18 at 0:03
  • @meuh it doesn't matter. it fails with /bin/bash and /bin/sh – vcardillo Aug 22 '18 at 0:04
6

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.

  • POSIX source: error exit and special builtins – Fólkvangr Aug 21 '18 at 10:11
  • 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). – Isaac Aug 23 '18 at 0:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.