Я прочитал много вопросов на различных сайтах обмена стека и справочных форумах Unix о том, как изменить параметры оболочки, а затем восстановить их - наиболее полный вопрос, который я нашел здесь, находится в разделе Как «отменить» `set -x`?
Получил мудрость , как представляется, либо сохранить от результата set +oили , shopt -poа затем evalпозже восстановить предыдущие настройки.
Однако, в моем собственном тестировании с bash 3.x и 4.x, errexitопция не сохраняется правильно при выполнении подстановки команд.
Вот пример сценария, чтобы показать проблему:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
И вывод (я обрезал некоторые нерелевантные переменные):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
Это кажется чрезвычайно опасным. Большинство сценариев, которые я пишу, зависят от errexitостановки выполнения в случае сбоя какой-либо команды Я только что обнаружил ошибку в одном из моих сценариев, вызванную этим, когда функция, которая должна была быть восстановлена errexitв конце, завершила его переопределение, установив для него значение по умолчанию off в течение всего сценария.
То, что я хотел бы сделать, это написать функции, которые могут устанавливать параметры по мере необходимости, а затем правильно восстанавливать все параметры перед выходом. Но похоже, что в подоболочке, вызываемой подстановкой команды, errexitне наследуется.
Я в растерянности из-за того, как сохранить результат set +oбез использования подстановки команд или прыжков через обручи FIFO. Я могу читать из, $SHELLOPTSно это не для записи или в eval--формате.
Я знаю, что альтернативой является использование функции subshell , но это создает много головной боли из-за возможности регистрировать выходные данные, а также возвращать несколько переменных.
Вероятно, связано: /programming/29532904/bash-subshell-errexit-semantics (кажется, есть обходной путь для Bash 4.4 и выше, но я бы предпочел портативное решение)
shoptпараметры набора bash (например, nullglob).