Digamos que eu exportei uma variável:
foo=bar
export foo
Agora, gostaria de cancelar a exportação. Ou seja, se eu fizer sh -c 'echo "$foo"'
, não devo bar
. foo
não deve aparecer no sh -c
ambiente de todo.
sh -c
é apenas um exemplo, uma maneira fácil de mostrar a presença de uma variável. O comando pode ser qualquer coisa - pode ser algo cujo comportamento é afetado simplesmente pela presença da variável em seu ambiente.
Eu posso:
unset
a variável e perca- Remova-o usando
env
para cada comando:env -u foo sh -c 'echo "$foo"'
- impraticável se você quiser continuar usando o shell atual por um tempo.
Idealmente, eu gostaria de manter o valor da variável, mas não aparecer em nenhum processo filho, nem mesmo como uma variável vazia.
Eu acho que eu poderia fazer:
otherfoo="$foo"; unset foo; foo="$otherfoo"; unset otherfoo
Isso corre o risco de pisar otherfoo
, se já existir.
Este é o único caminho? Existem formas padrão?
mktemp
se que é suficiente portátil, e Desativar o valor ea origem do arquivo temporário para atribuir a variável. Pelo menos um arquivo temporário pode ser criado com um nome mais ou menos arbitrário, em contraste com uma variável do shell.sh -c
comando é apenas um exemplo. Tome qualquer comando dentro do qual você não possa desmarcar uma variável em seu lugar, se desejar.Respostas:
Não existe um caminho padrão.
Você pode evitar o uso de uma variável temporária usando uma função A função a seguir cuida para manter variáveis não definidas e variáveis vazias vazias. No entanto, ele não suporta recursos encontrados em alguns shells, como variáveis somente leitura ou digitadas.
No ksh, bash e zsh, você pode não exportar uma variável com
typeset +x foo
. Isso preserva propriedades especiais, como tipos, por isso é preferível usá-lo. Eu acho que todas as conchas que têm umtypeset
builtin têmtypeset +x
.fonte
${var+foo}
, ele avaliafoo
sevar
está definido, mesmo que vazio, e nada mais.typeset +x
vsexport -n
para as conchas que suportam a primeira? Éexport -n
mais raro ou não preserva algumas propriedades?export -n
outypeset +x
indiferentemente. Em ksh ou zsh, há apenastypeset +x
.EDIT: Por
bash
apenas, como apontado nos comentários:A
-n
opção paraexport
remover aexport
propriedade de cada nome. (Vejahelp export
.)Então, para
bash
, o comando que você quer é:export -n foo
fonte
Eu escrevi uma função POSIX semelhante, mas isso não corre o risco de execução arbitrária de código:
Ele também manipulará quantos argumentos você desejar para fornecê-lo. Se um argumento for um nome válido que ainda não está definido, ele será ignorado silenciosamente. Se um argumento é um nome ruim, ele grava no stderr e pára conforme o apropriado, embora qualquer nome válido anterior a um inválido em sua linha de comando ainda seja processado.
Eu pensei em outro caminho. Eu gosto muito melhor.
Bem, ambos usam muitas das mesmas técnicas. Basicamente, se um shell var estiver desativado, uma referência a ele não será expandida com uma
+
expansão de parâmetro. Mas se estiver definido - independentemente do seu valor -, uma expansão de parâmetro como:${parameter+word}
será expandida paraword
- e não para o valor da variável. E assim, as variáveis de shell são testadas e substituídas com êxito.Eles também podem falhar . Na função superior, se for encontrado um nome incorreto, passo
$1
para nulo$2
e deixo$1
nulo, porque a próxima coisa que faço é terreturn
êxito se todos os argumentos tiverem sido processados e o loop chegar ao fim ou, se o argumento for inválido, o shell será expanda o$2
into$1:?
que matará um shell com script e retornará uma interrupção para um interativo enquanto escreveword
para stderr.No segundo
getopts
, as atribuições. E não atribuirá um nome incorreto - em vez disso, escreva; ele escreverá uma mensagem de erro padrão para o stderr. Além disso, ele salva o valor do argumento$OPTARG
se o argumento era o nome de uma variável definida em primeiro lugar. Então, depois de fazergetopts
tudo o que é necessário, é a expansão deeval
um conjuntoOPTARG
para a atribuição apropriada.fonte
export
um nome estranho, ele não matará o seu computador.var=something; varname=var; export "$varname"
é perfeitamente válido. o mesmo valeunset
, e com isso e com o outro, mas no minuto em que o conteúdo dessa"$varname"
variável fica louco, pode ser lamentável. e é assim que toda essabash
falha de exportação de função aconteceu de qualquer maneira.