Eu posso correr ENV_VAR=value command
para executar command
com um valor específico para ENV_VAR
. Qual é o equivalente a unset ENV_VAR
para command
?
shell
environment-variables
Alexey Romanov
fonte
fonte
command
é uma escolha infeliz de espaços reservados, pois na verdade existe um comando interno com esse nome.mycommand
ousomecommand
isso pode ser um hábito melhor para entrar.cmd
para isso.Respostas:
Além da
-i
opção, que limpa todo o ambiente, o POSIXenv
não fornece nenhuma maneira de desmarcar uma variável.No entanto, com algumas
env
implementações (incluindo GNU,busybox
'e FreeBSD, pelo menos), você pode:O que funcionaria para remover todas as instâncias de uma
ENV_VAR
variável do ambiente (observe que ela não funciona para a variável de ambiente com um nome vazio (env -u ''
gera um erro ou é ineficaz dependendo da implementação, mesmo que todos aceitemenv '=value'
, provavelmente uma limitação incorridos pelaunsetenv()
função C, que o POSIX requer para retornar um erro para a cadeia vazia, enquanto não houver essa limitação paraputenv()
)).Portably (em shells POSIX), você pode fazer:
(observe que, com alguns shells, usar
exec
pode alterar o quecommand
é executado: executa o sistema de arquivos em vez de uma função ou um componente interno, por exemplo (e ignoraria aalias
expansão obviamente), comoenv
acima. Você gostaria de omitir esses casos) .Mas isso não funcionará para variáveis de ambiente que tenham um nome que não possa ser mapeado para uma variável de shell (observe que alguns shells, como
mksh
essas, tirariam essas variáveis do ambiente na inicialização de qualquer maneira) ou variáveis marcadas como somente leitura.-v
é para o shell Bourne ebash
cujounset
sem-v
poderia desabilitar umaENV_VAR
função se não houvesse variável com esse nome. A maioria dos outros shells não desabilita funções, a menos que você passe na-f
opção. (improvável que faça diferença na prática).(Também tenha cuidado com o bug / falha de
bash
/mksh
/yash
cujaunset
, em algumas circunstâncias, pode não desmarcar a variável, mas revelar a variável em um escopo externo )Se
perl
estiver disponível, você pode fazer:O que funcionará mesmo para a variável de ambiente com um nome vazio.
Agora, tudo isso não funcionará se você desejar alterar uma variável de ambiente para um builtin ou função e não desejar que eles sejam executados em um subshell, como em
bash
:(aqui desabilitar LANG como uma abordagem equivocada para garantir
.
seja usado e entendido como o separador decimal. Seria melhor usarLC_ALL=C printf...
isso)Com alguns shells, você pode criar um escopo local para a variável usando uma função:
Com
zsh
, você também pode usar uma função anônima:Essa abordagem não funcionará em alguns shells (como os baseados no shell Almquist),
local
que não declaram a variável como inicialmente desativada (mas herdam o valor e os atributos). Nessas, você pode fazerlocal ENV_VAR; unset ENV_VAR
, mas não faça issomksh
ouyash
(emtypeset
vezlocal
disso), pois isso não funcionaria,unset
pois apenas cancelaria olocal
.¹ Também tenha cuidado que em
bash
, o localENV_VAR
(embora não definido) reteria o atributo de exportação . Portanto, secommand
fosse uma função que atribui um valorENV_VAR
, a variável estará disponível no ambiente de comandos chamados posteriormente.unset ENV_VAR
limparia esse atributo. Ou você pode usar olocal +x ENV_VAR
que também garantiria uma lista limpa (a menos que essa variável tenha sido declarada somente leitura, mas não há nada que você possa fazer sobre issobash
).fonte
env '=foo' python -c 'import os; print os.environ[""]'
. Não espero que muitas pessoas queiram definir uma variável assim.Não há equivalente direto, até onde eu saiba; você pode usar um subshell:
fonte
(unset ENV_VAR; exec somecommand)
se você quiser ser equivalente ao original em eficiência (consumindo o subshell). Como é, isso adiciona um garfo extra.command
é o último comando na invocação do subshell.env -u
.Você pode usar
ENV_VAR= command
Na verdade, isso não desmarca a variável, mas pode ser útil em muitos casos (os scripts de shell geralmente usam apenas
test -n
para verificar se uma variável está definida):fonte