Variáveis locais em zsh: qual é o equivalente do bash “export -n” em zsh

10

Estou tentando conter o escopo de uma variável para um shell e não permitir que os filhos o vejam, em zsh. Por exemplo, eu digito isso em .zshrc:

GREP_OPTIONS=--color=always

Mas se eu executar um script de shell com o seguinte:

#!/bin/bash
echo $GREP_OPTIONS

A saída é:

--color=always

enquanto eu quero que seja nulo (o script de shell acima não deve ver a variável GREP_OPTIONS).

No bash, pode-se dizer: export -n GREP_OPTIONS=--color=always , o que impedirá que isso aconteça. Como faço isso em zsh?

    
por PonyEars 27.01.2014 / 23:49

2 respostas

10

export em zsh é uma abreviação de typeset -gx , em que o atributo g significa “global” (em oposição a local para uma função) e o atributo x significa “exportado” (ou seja, no ambiente) . Assim:

typeset +x GREP_OPTIONS

Isso também funciona em ksh e bash.

Se você nunca exportar GREP_OPTIONS em primeiro lugar, não será necessário exportá-lo.

Você também pode usar o modo indireto e portátil: descompactar uma variável. Em ksh / bash / zsh, isso não funciona se a variável for somente leitura.

tmp=$GREP_OPTIONS
unset GREP_OPTIONS
GREP_OPTIONS=$tmp
    
por 28.01.2014 / 00:29
6

Você poderia usar uma função anônima para fornecer um escopo para a variável. De 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.

Mas, além disso, se você não estiver usando export no seu .zshrc , a variável só deve estar visível na sua sessão interativa atual e não deve ser exportada para sub-listas.

Como terdon explicou em seu comentário: export -n in bash apenas faz com que a propriedade "export" seja removida da variável, portanto, usar export -n GREP_OPTIONS=--color=always é equivalente a não usar exportação - GREP_OPTIONS=--color=always . / p>

Em outras palavras, para obter o comportamento desejado, simplesmente não use export . Em vez disso, no seu .zshrc , você deve ter

GREP_OPTIONS=--color=always

Isso tornará a variável disponível para todos os shells (interativos, sem login) que você executar, exatamente como você deseja, mas não será exportada para shells filho.

    
por 27.01.2014 / 23:55