Puedo correr ENV_VAR=value command
para correr command
con un valor específico para ENV_VAR
. ¿Cuál es el equivalente a desarmar ENV_VAR
para command
?
shell
environment-variables
Alexey Romanov
fuente
fuente
command
es una elección desafortunada de marcadores de posición, ya que en realidad hay un comando incorporado con ese nombre.mycommand
osomecommand
tal vez sea un mejor hábito para entrar.cmd
para eso.Respuestas:
Aparte de la
-i
opción, que borra todo el entorno, POSIXenv
no proporciona ninguna forma de desarmar una variable.Sin embargo, con algunas
env
implementaciones (incluidas GNU,busybox
'y FreeBSD al menos), puede hacer:Lo que funcionaría para eliminar cada instancia de una
ENV_VAR
variable del entorno (tenga en cuenta que no funciona para la variable de entorno con un nombre vacío (env -u ''
da un error o es ineficaz dependiendo de la implementación, aunque todos aceptan)env '=value'
, probablemente una limitación) incurrido por launsetenv()
función C que POSIX requiere para devolver un error para la cadena vacía, mientras que no existe tal limitación paraputenv()
)).Portablemente (en shells POSIX), puede hacer:
(tenga en cuenta que con algunos shells, el uso
exec
puede cambiar quécommand
se ejecuta: ejecuta el que está en el sistema de archivos en lugar de una función o incorporado, por ejemplo (y omitiría laalias
expansión, obviamente), comoenv
arriba. Desearía omitirlo en esos casos) .Pero eso no funcionará para las variables de entorno que tienen un nombre que no se puede asignar a una variable de shell (tenga en cuenta que algunos shells como
mksh
eliminarían esas variables del entorno en el inicio de todos modos), o variables que se han marcado como de solo lectura.-v
es para el shell Bourne ybash
cuyounset
sin-v
podría desarmar unaENV_VAR
función si no hubiera variable con ese nombre. La mayoría de los otros shells no desarmarían las funciones a menos que pases la-f
opción. (Es poco probable que haga una diferencia en la práctica).(También tenga cuidado con el error / mal funcionamiento de
bash
/mksh
/yash
cuyounset
, bajo ciertas circunstancias, no puede desarmar la variable, pero revela la variable en un ámbito externo )Si
perl
está disponible, puede hacer:Lo que funcionará incluso para la variable de entorno con un nombre vacío.
Ahora, todo eso no funcionará si desea cambiar una variable de entorno para una función o función incorporada y no desea que se ejecuten en una subshell, como en
bash
:(aquí, desarmar LANG como un enfoque equivocado para asegurarse de que
.
se usa y se entiende como el separador decimal. Sería mejor usarLC_ALL=C printf...
para eso)Con algunos shells, puede crear un ámbito local para la variable usando una función:
Con
zsh
, también puede usar una función anónima:Ese enfoque no funcionará en algunos shells (como los basados en el shell Almquist),
local
que no declaran la variable como inicialmente no establecida (pero heredan el valor y los atributos). En esos, puede hacerlolocal ENV_VAR; unset ENV_VAR
, pero no lo haga enmksh
oyash
(entypeset
lugar de hacerlolocal
) ya que eso no funcionaría,unset
solo estaría cancelando ellocal
.¹ También tenga en cuenta que en
bash
el localENV_VAR
(aunque no esté configurado) retendría el atributo de exportación . Entonces, sicommand
se tratara de una función que asigna un valorENV_VAR
, la variable estaría disponible en el entorno de los comandos llamados posteriormente.unset ENV_VAR
borraría ese atributo. O puede usar ellocal +x ENV_VAR
que también garantizaría una pizarra limpia (a menos que esa variable se haya declarado de solo lectura, pero no hay nada que pueda hacer al respectobash
).fuente
env '=foo' python -c 'import os; print os.environ[""]'
. No espero que muchas personas quieran establecer una variable como esa.No hay equivalente directo hasta donde yo sé; puedes usar una subshell:
fuente
(unset ENV_VAR; exec somecommand)
si quiere ser equivalente al original en eficiencia (consumiendo la subshell). Tal como está, esto agrega un tenedor adicional.command
es el último comando en la invocación de subshell.env -u
.Puedes usar
ENV_VAR= command
En realidad, esto no desarma la variable, pero puede ser útil en muchos casos (los scripts de shell generalmente solo se usan
test -n
para verificar si una variable está configurada):fuente