Возврат из эмуляции bash unsets zsh opts

298
Jounathaen

Поэтому у меня есть несколько скриптов установки, которые работают только с bash(потому что они используют, например, ==или $BASH_SOURCE).

Он работает для получения этих сценариев с помощью команды zsh emulate:

emulate bash source setupscipt.bash emulate zsh 

Но это сбрасывает мои zsh-опции как "autocd" (установленный в .zshrc).

Как мне начать и выйти из эмуляции bash, чтобы мои настройки остались такими же, как они?

3

1 ответ на вопрос

3
mpy

Зефрам ответил на аналогичный вопрос в списке рассылки zsh более 20 лет назад :

Решение состоит в том, чтобы использовать функцию - давайте назовем ее source_bash- для создания исходного сценария bash:

function source_bash { emulate -L bash builtin source "$@" } 

Уловка - опция localoptions, которая описана следующим образом на странице руководства:

LOCAL_OPTIONS Если этот параметр установлен в точке возврата из функции оболочки, большинство параметров (включая этот), которые действовали при входе в функцию, восстанавливаются; варианты, которые не восстановлены, являются привилегированными и ограниченными. В противном случае, только эта опция и опции LOCAL_LOOPS, XTRACE и PRINT_EXIT_VALUE будут восстановлены. Следовательно, если это явно не установлено функцией оболочки, остальные параметры, действующие в точке возврата, останутся такими. Функция оболочки также может гарантировать себе известную конфигурацию оболочки с формулировкой, подобной `emulate -L zsh '; -L активирует LOCAL_OPTIONS.

Поставьте эту функцию на свой, ~/.zshrcи вам нужно будет только сделать

$ source_bash setupscipt.bash 

когда необходимо.

Прикольный трюк, но просто чтобы быть уверенным: переменные окружения, которые установлены в setupscript, также будут установлены в родительском zsh? Jounathaen 6 лет назад 0
@Jounathaen: Да. Опция `localoptions` восстанавливает только zsh _options_; среда остается неизменной. Но, пожалуйста, попробуйте, если он работает именно так, как вы хотите. mpy 6 лет назад 2
Как упомянуто в последней строке этой цитаты справочной страницы, можно использовать более короткий `emulate -L bash` вместо того, чтобы` setopt localoptions` в своей собственной строке. :) ZeroKnight 6 лет назад 1
@ZeroKnight: Да, ты прав. Я отредактировал функцию соответственно. mpy 6 лет назад 0