Por que 'source foo && true' sai do script no bash?

1

Então, eu li isso: O script Bash com 'set -e' não para em '... & & ... 'comando

Faz sentido. Então agora, a questão:

Teste 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

Teste 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

Por que source viola exclusivamente essa regra ( negrito )?

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

    
por vcardillo 21.08.2018 / 02:22

1 resposta

6

source é um alias para o comando ponto . e o comando ponto é um chamado special command onde POSIX descreve que esses comandos saem de todo o shell não interativo no caso de ocorrer um erro.

Se você chamar seu comando via:

bash test.sh

o bash não sai, mas quando você liga:

bash -o posix test.sh

sai. Então o seu bash foi compilado para ser compatível com POSIX por padrão ou você chamou um shell diferente do bash.

Veja o link para o padrão.

    
por 21.08.2018 / 10:51