Why do I get exit code 0 here?
O motivo é que, com as aspas duplas, a expansão de parâmetro (do parâmetro especial, $?
) é executada antes de passar argumentos para o novo processo de Bash. Se você ativar o modo de depuração e detalhado, poderá ver isso claramente:
$ set -xv
$ bash -c "(./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?)"
bash -c "(./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?)"
+ bash -c '(./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: 0)'
running exit-code with 1
last exit code: 0
$ set +xv
Nesse caso, $?
é definido como 0
porque o comando anterior ( set -xv
neste exemplo) foi executado com êxito.