Shell normal vs subshell versus código de saída do último comando “bash -c”

4

Estou tentando obter o código de saída do último comando encadeado com & & e || corretamente.

Eu encontrei um comportamento estranho que não posso explicar. Por favor ajude.

Eu uso este script de teste para retornar o código de saída:

gdubicki@mbp-greg:~ $ cat exit-code.sh
#!/bin/bash
echo "running exit-code with $1"
exit $1

Isso funciona como esperado:

gdubicki@mbp-greg:~ $ ./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

gdubicki@mbp-greg:~ $ (./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:

gdubicki@mbp-greg:~ $ /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?

    
por Greg Dubicki 08.09.2016 / 13:49

2 respostas

3

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.

    
por 08.09.2016 / 15:18
1

Citações

Use apenas aspas simples

/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: 1
    
por 08.09.2016 / 14:47

Tags