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
?
cmd
para eso.
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
?
cmd
para eso.
Respuestas:
Aparte de la -i
opción, que borra todo el entorno, POSIX env
no proporciona ninguna forma de desarmar una variable.
Sin embargo, con algunas env
implementaciones (incluidas GNU, busybox
'y FreeBSD al menos), puede hacer:
env -u ENV_VAR command
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 la unsetenv()
función C que POSIX requiere para devolver un error para la cadena vacía, mientras que no existe tal limitación para putenv()
)).
Portablemente (en shells POSIX), puede hacer:
(unset -v ENV_VAR; exec command)
(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 la alias
expansión, obviamente), como env
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 y bash
cuyo unset
sin -v
podría desarmar una ENV_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
cuyo unset
, bajo ciertas circunstancias, no puede desarmar la variable, pero revela la variable en un ámbito externo )
Si perl
está disponible, puede hacer:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
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
:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(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:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
Con zsh
, también puede usar una función anónima:
(){local ENV_VAR; command}
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 hacerlo local ENV_VAR; unset ENV_VAR
, pero no lo haga en mksh
o yash
(en typeset
lugar de hacerlo local
) ya que eso no funcionaría, unset
solo estaría cancelando el local
.
¹ También tenga en cuenta que en bash
el local ENV_VAR
(aunque no esté configurado) retendría el atributo de exportación . Entonces, si command
se tratara de una función que asigna un valor ENV_VAR
, la variable estaría disponible en el entorno de los comandos llamados posteriormente. unset ENV_VAR
borraría ese atributo. O puede usar el local +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 respecto bash
).
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:
(unset ENV_VAR; exec command)
(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):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR:
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.