Variables locales dans zsh: quel est l'équivalent de "export -n" de bash dans zsh

J'essaye de contenir la scope d'une variable à un shell, et de ne pas voir les enfants, dans zsh. Par exemple, je tape ceci dans .zshrc:

GREP_OPTIONS=--color=always 

Mais si j'exécute un script shell avec ce qui suit:

 #!/bin/bash echo $GREP_OPTIONS 

La sortie est:

 --color=always 

alors que je veux qu'il soit nul (le script shell ci-dessus ne devrait pas voir la variable GREP_OPTIONS).

En bash, on peut dire: export -n GREP_OPTIONS=--color=always , ce qui empêchera que cela se produise. Comment est-ce que j'accomplis ceci dans zsh?

export dans zsh est un raccourci pour le typeset -gx , où l'atsortingbut g signifie «global» (par opposition à local à une fonction) et l'atsortingbut x signifie «exporté» (c'est-à-dire dans l'environnement). Ainsi:

 typeset +x GREP_OPTIONS 

Cela fonctionne aussi dans ksh et bash.

Si vous n'exportez jamais GREP_OPTIONS en premier lieu, vous n'avez pas besoin de l'exporter.

Vous pouvez également utiliser la méthode indirecte et portable: désinstaller une variable l'éxporte. Dans ksh / bash / zsh, cela ne fonctionne pas si la variable est en lecture seule.

 tmp=$GREP_OPTIONS unset GREP_OPTIONS GREP_OPTIONS=$tmp 

Vous pouvez utiliser une fonction anonyme pour fournir une scope à la variable. De l' 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. 

Mais en dehors de cela, si vous n'utilisez pas d' export dans votre .zshrc , la variable ne devrait être visible que dans votre session interactive actuelle et elle ne devrait pas être exscope vers des sous-shell.

Comme l'explique terdon dans son commentaire: export -n dans bash fait que la propriété "export" est supprimée de la variable, donc utiliser export -n GREP_OPTIONS=--color=always équivaut à ne pas utiliser d'export du tout – GREP_OPTIONS=--color=always .

En d'autres termes, pour get le comportement souhaité, n'utilisez pas l' export . Au lieu de cela, dans votre .zshrc , vous devriez avoir

 GREP_OPTIONS=--color=always 

Cela rendra la variable disponible pour tous les shells (interactifs, non-connectés) que vous exécutez, comme vous le souhaitez, mais elle ne sera pas exscope vers des shells enfant.