Рассмотрим следующий код
outer-scope.sh
#!/bin/bash
set -e
source inner-scope.sh
echo $(inner)
echo "I thought I would've died :("
inner-scope.sh
#!/bin/bash
function inner() { echo "winner"; return 1; }
Я пытаюсь outer-scope.sh
выйти, когда inner()
не удается позвонить . Так как $()
вызывает вложенную оболочку, этого не происходит.
Как еще можно получить выходные данные функции, сохранив тот факт, что функция может завершиться с ненулевым кодом выхода?
echo $()
, то это может быть из-за того, что коды выхода подоболочек игнорируются, когда строка -echo
команда - имеет собственный код выхода (обычно 0).if ! $(exit 1) ; then echo $?; fi
, я получаю0
. Не уверен, чтоif
это правильный путь, если вам нужно сохранить это значение выхода.if ! output=$(inner); then exit $?; fi
выйдет с кодом возврата 0, потому$?
что!
вместо кода возврата будет указан код возвратаinner
. Вы могли бы получить желаемое поведение с,if output=$(inner); then : ; else exit $?; fi
но это, очевидно, более многословноСмотрите BashFAQ / 002 :
Особый случай
Обратите внимание на сложный случай с локальными переменными функции, сравните следующий код:
Мы получим:
Почему?
Когда выходные данные подоболочки используются для инициализации
local
переменной, состояние выхода больше не подчиненной оболочки, а команды , что, скорее всего, будет .local
0
Смотрите также https://stackoverflow.com/a/4421282/537554
источник
Добавляя
echo
, подоболочка не стоит отдельно (не проверяется отдельно) и не прерывается. Назначение обходит эту проблему.Вы также можете сделать это и перенаправить вывод в файл для последующей обработки.
источник