Захват кода завершения сценария оболочки без вызова subshell - PullRequest
0 голосов
/ 31 января 2020

У меня есть два сценария оболочки:

test. sh

function func() {
echo $1
exit 1
}

run. sh

source ./test.sh

func "Hello"
exitCode=$?
echo "Output: ${exitCode}"

Результат:

Hello

Текущая проблема, с которой я сталкиваюсь, заключается в том, что когда функция fun c возвращает 1, мой запуск. sh скрипт прерывается и после него ничего не выполняется. Итак, есть ли способ, которым я могу эффективно захватить код выхода, не прерывая работу. sh. Я знаю, что есть способ вызвать subshell, используя ( func "Hello" ), но я хочу сделать это без вызова sub-shell, используя flock. Я посмотрел на справочный пример, но не смог найти ничего близкого к нему.

1 Ответ

0 голосов
/ 01 февраля 2020

2 идеи, которые "раздвигают границы". Используйте с осторожностью , так как будущие изменения в исходных сценариях могут нарушить логику c. Рекомендуется, только если есть способ следить за тем, что скрипт работает нормально - например, при интерактивном исполнении и т. Д. c.

Я бы не использовал подобные решения в любой производственной / критической системе.

Вариант 1. Псевдоним 'выход' к 'возврату' при поиске файла.

Предполагается, что ВСЕ операторы 'exit' в тесте. sh должны быть заменены на «возврат», и при условии, что вы готовы пойти на риск будущих изменений в тесте. sh, рассмотрите возможность использования alias перед поиском

alias exit=return
source test.sh
unalias exit
func "foo"

Вариант 2: автоматическое обновление функция, которая использует 'exit' для использования return.

source test.sh
body=$(type func | tail +2 | sed -e 's/exit/return/g')
eval "$body"
...