Eu uso set -e
para parar o script bash no primeiro erro .
Todos funcionam bem, a menos que eu use o comando com &&
:
$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$
comparado com:
$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$
O primeiro exemplo ainda ecoa I'm running!
, mas o segundo não. Por que eles se comportam de maneira diferente?
UPD. Pergunta semelhante: /programming/6930295/set-e-and-short-tests
bash
shell-script
shell
907º
fonte
fonte
cd
comando malsucedidoset -e
comportamento é surpreendente.Respostas:
Este é um comportamento documentado. A página do manual bash (1) diz, para
set -e
,E a especificação de linguagem de comando do shell POSIX confirma que este é o comportamento correto:
e a Seção 2.9.3 Listas desse documento define
fonte
A
set -e
opção não tem efeito em algumas situações, e esse é o comportamento padrão e portátil através do shell compatível com POSIX.O comando com falha faz parte do pipeline:
irá imprimir
printed
.E apenas a falha do pipeline é considerada:
não imprimirá nada.
A corrida comando falhou na lista seguinte composto a
while
,until
,if
,elif
palavra reservada, um gasoduto começando com a!
palavra reservada, ou qualquer comando como parte de&&
ou||
lista, exceto o último:O último comando que falha ainda torna
set -e
afetado:O subshell falha em um comando composto:
fonte
echo "printed"
eecho "not_printed"
nos seus exemplos (em vez deecho 1
).set -e
causa uma saída dentro(false && true); echo not here
, mas não dentro{ false && true; }; echo here
, apesar de YMMV com shells diferentes e até versões diferentes de um mesmo shell. Eu não tocariaset -e
com um poste de barcaça e, em vez disso, faria o tratamento adequado de erros.meu palpite é que a condição se-então é avaliada como um todo.
eu tentei
quem dá
o código de erro é capturado pela condição if, portanto, o bash não acionará o fim da execução.
fonte
if ... fi