Как сохранить и восстановить все параметры оболочки, включая errexit

Я прочитал много вопросов на разных сайтах обмена стеками и форумах справки unix о том, как изменять параметры оболочки, а затем восстанавливать их. Наиболее исчерпывающий из них я нашел здесь, как «отменить» «установить -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 в конце, завершила ее errexit , установив ее на значение по умолчанию off на протяжении всего скрипта.

То, что я хотел бы сделать, это написать функции, которые могут задавать параметры по мере необходимости, а затем полностью восстановить все параметры перед выходом. Но похоже, что в подоболочке, вызванной подстановкой команды, errexit не наследуется.

Я затрудняюсь для того, чтобы сэкономить результат set +o без использования подстановки команд или перескока через обручи FIFO. Я могу читать из $SHELLOPTS но он не доступен для записи или в формате eval -able.

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

Вероятно, это связано с https://stackoverflow.com/questions/29532904/bash-subshell-errexit-semantics (кажется, есть обходной путь для bash 4.4 и выше, но я бы предпочел иметь портативное решение)

One Solution collect form web for “Как сохранить и восстановить все параметры оболочки, включая errexit”

То, что вы делаете, должно работать. Но bash отключает параметр errexit в подстановках команд, поэтому он сохраняет все параметры, кроме этого. Это относится к bash и errexit опции errexit . Bash сохраняет errexit при работе в режиме POSIX. Начиная с bash 4.4, bash также не очищает errexit в подстановке команд, если shopt -s inherit_errexit .

Поскольку опция выключена, прежде чем какой-либо код будет выполняться внутри подстановки команды, вы должны проверить ее на внешнем уровне.

 OLDOPTS=$(set +o) case $- in *e*) OLDOPTS="$OLDOPTS; set -e";; *) OLDOPTS="$OLDOPTS; set +e";; esac 

Если вам не нравится эта сложность, вместо этого используйте zsh.

 setopt local_options 
  • Разница между командой `ls 2> tmp> tmp` и командой` ls> tmp`
  • Настройка Yaboot и Debian для загрузки в командной строке командной строки?
  • Начать sh в указанной директории из inittab
  • Запустить сценарий в неинтерактивной оболочке?
  • Запуск приложения без удержания терминала
  • создать файл из функции
  • Как создать прослушиватель TCP?
  • Что я могу узнать об этой части кода?
  • Есть ли способ установить размер списка истории в bash более чем на 5000 строк?
  • Что означает «если!»?
  • Как сравнить строки в ksh
  • «Сбор» файлов для дальнейшей обработки
  • Interesting Posts

    ошибка перфоратора: не удалось mmap с 25 (несоответствующий ioctl для устройства)

    Эффективность большого количества часов inotify или stat

    Скопируйте текст из одной панели tmux в другую (используя vim)

    Где люди используют документ «Здесь» в системах UNIX?

    Уменьшите размер вкладки затмения с помощью GTK-тематики

    Вращающиеся лог-файлы Rsync

    Почему может быть создана программная ссылка на каталог с или без косой черты?

    SSH'd в компьютер, время безотказной работы / кто / пользователи сообщают 0 пользователей?

    Как загрузить источник нувори в выбранном каталоге с помощью Portage?

    Какие файловые системы поддерживают резервное копирование моментальных снимков из живой системы?

    Оптимальная конфигурация SSD

    Метаданные mdadm: следует ли принимать меры предосторожности для предотвращения перезаписи суперблока?

    Установка Centos-7 зависает в пакете microcode-ctl

    Fedora 20: пользователи не могут войти в свой домашний каталог

    Маршрутизировать весь HTTP-трафик через polipo

    Linux и Unix - лучшая ОС в мире.