Почему `source foo && true` завершает работу скрипта в bash?

Итак, я прочитал это: Bash-скрипт с `set -e` не останавливается на команде` … && … `

Это имеет смысл. Итак, теперь вопрос:

Тест А:

$ 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 

Тест Б:

 $ 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 однозначно нарушает это правило ( выделено жирным шрифтом )?

Оболочка не завершает работу, если сбойная команда является частью списка команд, следующих сразу за ключевым словом некоторое время или до, часть теста после зарезервированных слов if или elif, часть любой команды, выполненной в символах && или || список, за исключением команды, следующей за последним символом && или ||, любой команды в конвейере, кроме последней, или если возвращаемое значение команды инвертируется с!.

source – псевдоним точки . Команда и команда точка – это так называемая special command где POSIX описывает, что эти команды выходят из всей неинтерактивной оболочки в случае возникновения ошибки.

Если вы вызываете свою команду через:

 bash test.sh 

Баш не выходит, но когда вы звоните:

 bash -o posix test.sh 

это выходит. Таким образом, либо ваш bash был скомпилирован для совместимости с POSIX по умолчанию, либо вы вызывали оболочку, отличную от bash.

См. Стандарт http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14 .