Estou tentando obter o código de saída do último comando encadeado &&
e ||
corretamente.
Encontrei um comportamento estranho que não consigo explicar. Por favor ajude.
Este é o meu exit-code.sh
script de teste:
#!/bin/bash
echo "running exit-code with $1"
exit $1
Isso funciona como esperado:
$ ./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?
running exit-code with 1
last command exit code: 1
O mesmo ()
para executá-lo em um subshell:
$ (./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?)
running exit-code with 1
last exit code: 1
Mas:
$ /bin/bash -c "./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?"
running exit-code with 1
last exit code: 0
Por que recebo o código de saída 0 aqui?
A razão é que com as aspas duplas, a expansão do parâmetro (do parâmetro especial,
$?
) é realizada antes de passar os argumentos para o novo processo Bash. Se você ativar o modo de depuração e detalhado, poderá ver isso claramente:Neste caso,
$?
está definido como0
porque o comando anterior (set -xv
neste exemplo) foi executado com sucesso.Citações
Basta usar aspas simples '