Intereting Posts
Найти старое имя каталога на удаленном сервере? AWK – формирование SN из диапазонов и добавление его к записи Разбор файла в соответствии с парой идентификаторов и более высокими значениями ниже В чем разница между установкой программного обеспечения как root или пользователем? Неопределенный символ в libharfbuzz Переустановка Ubuntu из Windows? Простая, если команда не работает в скрипте csh Настройка трафика для туннеля GRE Могу ли я написать консольную программу, которая работает с несколькими кодировками символов? Поиск файлов для строки и если найден, проверьте, существует ли файл с парным именем в том же каталоге Могут ли какие-либо инструменты компиляции генерировать информацию .buildinfo по умолчанию или нужны флаги? Установка libxcb из источника Как установить GRUB с двойной загрузкой в ​​режиме Legacy? любой способ объединить grep и tail для создания таблицы таблицы из командной строки Как настроить собственный сервер записи DNS?

Локальные переменные в zsh: что эквивалентно «export -n» bash в zsh

Я пытаюсь скрыть область действия переменной в оболочке и не видеть ее в zsh. Например, я набираю это в .zshrc:

GREP_OPTIONS=--color=always 

Но если я запустил скрипт оболочки со следующим:

 #!/bin/bash echo $GREP_OPTIONS 

Выход:

 --color=always 

в то время как я хочу, чтобы он был нулевым (сценарий оболочки выше не должен вообще видеть переменную GREP_OPTIONS).

В bash можно сказать: export -n GREP_OPTIONS=--color=always , что предотвратит это. Как это сделать в zsh?

export в zsh является сокращением для typeset -gx , где атрибут g означает «глобальный» (в отличие от локального для функции), а атрибут x означает «экспортированный» (т.е. в среде). Таким образом:

 typeset +x GREP_OPTIONS 

Это также работает в ksh и bash.

Если вы никогда не экспортируете GREP_OPTIONS в первую очередь, вам не нужно его экспортировать.

Вы также можете использовать косвенный, переносимый способ: отключить переменную. В ksh / bash / zsh это не работает, если переменная доступна только для чтения.

 tmp=$GREP_OPTIONS unset GREP_OPTIONS GREP_OPTIONS=$tmp 

Вы можете использовать анонимную функцию, чтобы предоставить область для переменной. От man zshall :

 ANONYMOUS FUNCTIONS If no name is given for a function, it is `anonymous' and is handled specially. Either form of function definition may be used: a `()' with no preceding name, or a `function' with an immediately following open brace. The function is executed immediately at the point of definition and is not stored for future use. The function name is set to `(anon)'. Arguments to the function may be specified as words following the clos‐ ing brace defining the function, hence if there are none no arguments (other than $0) are set. This is a difference from the way other func‐ tions are parsed: normal function definitions may be followed by cer‐ tain keywords such as `else' or `fi', which will be treated as argu‐ ments to anonymous functions, so that a newline or semicolon is needed to force keyword interpretation. Note also that the argument list of any enclosing script or function is hidden (as would be the case for any other function called at this point). Redirections may be applied to the anonymous function in the same man‐ ner as to a current-shell structure enclosed in braces. The main use of anonymous functions is to provide a scope for local variables. This is particularly convenient in start-up files as these do not provide their own local variable scope. For example, variable=outside function { local variable=inside print "I am $variable with arguments $*" } this and that print "I am $variable" outputs the following: I am inside with arguments this and that I am outside Note that function definitions with arguments that expand to nothing, for example `name=; function $name { ... }', are not treated as anony‐ mous functions. Instead, they are treated as normal function defini‐ tions where the definition is silently discarded. 

Но кроме этого – если вы вообще не используете export в своем .zshrc , переменная должна быть только видна в вашем текущем интерактивном сеансе и не должна быть экспортирована в подоболочки.

Как объяснил Тердон в своем комментарии: export -n в bash просто заставляет свойство «export» удаляться из переменной, поэтому использование export -n GREP_OPTIONS=--color=always эквивалентно отсутствию экспорта вообще – GREP_OPTIONS=--color=always .

Другими словами, чтобы получить желаемое поведение, просто не используйте export . Вместо этого, в вашем .zshrc , вы должны иметь

 GREP_OPTIONS=--color=always 

Это сделает переменную доступной для всех (интерактивных, не входящих в систему) оболочек, которые вы запускаете, так же, как вы хотите, но она не будет экспортирована в дочерние оболочки.