Estou tentando conter o escopo de uma variável em um shell e não ter filhos vendo isso no 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 do shell acima não deve ver a variável GREP_OPTIONS).
No bash, pode-se dizer:, o export -n GREP_OPTIONS=--color=always
que impedirá que isso aconteça. Como faço isso no zsh?
shell-script
zsh
environment-variables
PonyEars
fonte
fonte
export -n
apenas exporta uma variável exportada.Respostas:
export
em zsh é uma abreviação paratypeset -gx
, onde o atributog
significa "global" (ao contrário de local para uma função) e o atributox
significa "exportado" (ou seja, no ambiente). Portanto:Isso também funciona no ksh e no bash.
Se você nunca exportar
GREP_OPTIONS
em primeiro lugar, não precisará exportar .Você também pode usar a maneira indireta e portátil: desmarcar uma variável não a exporta. No ksh / bash / zsh, isso não funciona se a variável for somente leitura.
fonte
env -u GREP_OPTIONS your-script
com algumasenv
implementações (qualquer shell). Ou(unset GREP_OPTIONS; exec your-script)
export_all
(-a
)? Mas mesmo assimtypeset +x GREP_OPTIONS
não exportaria a variável. Se você não encontrar o que está errado, tente a pesquisa binária: faça backup da sua.zshrc
, remova a segunda metade, veja se o problema ainda existe, acrescente o terceiro trimestre ou reduza para o primeiro trimestre e repita.Você pode usar uma função anônima para fornecer um escopo para a variável. De
man zshall
:Mas, além disso - se você não estiver usando a
export
sua.zshrc
, a variável deve estar visível apenas na sua sessão interativa atual e não deve ser exportada para subshells.Como Terdon explicou em seu comentário:
export -n
inbash
apenas faz com que a propriedade "export" seja removida da variável, portanto, usarexport -n GREP_OPTIONS=--color=always
é equivalente a não usar exportação de todo -GREP_OPTIONS=--color=always
.Em outras palavras, para obter o comportamento desejado, simplesmente não use
export
. Em vez disso,.zshrc
você deve terIsso tornará a variável disponível para todos os shells (interativos, sem logon) que você executar, exatamente como você deseja, mas não será exportada para shells filhos.
fonte