Введите оболочку script из другого script и проверьте код возврата

Я хочу загрузить файл, например name.sh из другого script, и проверить код возврата и принять его код ошибки. Если я использую

source name.sh

то если name.sh возвращает ненулевой код возврата, мой основной script перестает работать, но мне нужно решить, чтобы погода на выходе была продолжена или остановлена.

Если я использую

ret_code="`source name.sh`"
echo $ret_code

тогда ret_code имеет значение null и код ошибки не печатается. Я не могу использовать их:

sh name.sh
./name.sh
bash name.sh

потому что name.sh не является исполняемым, и я не хочу, чтобы он исполнялся

Ответ 1

Для запуска sh name.sh файла не требуется выполнение. Вместо использования $?.

sh name.sh
ret_code=$?

Ответ 2

Код возврата должен быть в переменной $?. Вы можете сделать следующее:

source name.sh         # Execute shell script
ret_code=$?            # Capture return code
echo $ret_code

Ответ 3

Амин, возвращаемое значение name.sh - это просто возвращаемое значение последней выполненной команды. Получите доступ к нему, используя $?, как обычно.

Самый простой способ захвата кода возврата - структурировать "name.sh", так что неудавшиеся команды приводят к тому, что больше не выполняется выполнение команд (что может преуспеть, а затем замаскировать ошибку). Поскольку вы используете bash, вы также можете использовать функции. Просто переместите свою логику в функцию и вызовите ее. Таким образом, ваш name.sh станет однострочным, а значение $? будет возвращено функцией.

Например:

# cat fred
function f() {complicated; logic; here; export FRED="asdf";return 1;}
f
# source fred
# echo $?
1
# echo $FRED
asdf

Однако, если вы добавите свою логику в функцию, вы можете также загрузить файл, а затем вызвать функцию в свободное время.

# cat fred
function f() {complicated; logic; here; export FRED="asdf";return 1;}
# source fred
# f && echo "that worked!" || echo "failed again"
failed again
# echo $FRED
asdf