Нормальная оболочка против подоболочки против «bash -c» код выхода последней команды

Я пытаюсь получить код выхода последней команды, связанной с && и || правильно.

Я столкнулся со странным поведением, которое не могу объяснить. Пожалуйста, помогите.

Я использую этот тестовый сценарий для возврата заданного кода выхода:

gdubicki@mbp-greg:~ $ cat exit-code.sh
#!/bin/bash
echo "running exit-code with $1"
exit $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 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

Но:

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

Почему я получаю здесь код выхода 0?

4
задан 8 September 2016 в 14:49
2 ответа

Почему я получаю здесь код выхода 0?

Причина в том, что с двойными кавычками выполняется расширение параметра (специального параметра, $? ) out перед передачей аргументов новому процессу Bash. Если вы включите режим отладки и подробный отчет, вы можете четко это увидеть:

$ 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

В этом случае $? установлено в 0 , потому что предыдущая команда ( установила -xv в этом примере) выполнено успешно.

3
ответ дан 3 December 2019 в 03:28

Цитаты

Просто используйте одинарные кавычки

/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
1
ответ дан 3 December 2019 в 03:28

Теги

Похожие вопросы