Puedo correr ENV_VAR=value commandpara correr commandcon un valor específico para ENV_VAR. ¿Cuál es el equivalente a desarmar ENV_VARpara command?
shell
environment-variables
Alexey Romanov
fuente
fuente

commandes una elección desafortunada de marcadores de posición, ya que en realidad hay un comando incorporado con ese nombre.mycommandosomecommandtal vez sea un mejor hábito para entrar.cmdpara eso.Respuestas:
Aparte de la
-iopción, que borra todo el entorno, POSIXenvno proporciona ninguna forma de desarmar una variable.Sin embargo, con algunas
envimplementaciones (incluidas GNU,busybox'y FreeBSD al menos), puede hacer:Lo que funcionaría para eliminar cada instancia de una
ENV_VARvariable 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
execpuede cambiar quécommandse ejecuta: ejecuta el que está en el sistema de archivos en lugar de una función o incorporado, por ejemplo (y omitiría laaliasexpansión, obviamente), comoenvarriba. 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
mksheliminarían esas variables del entorno en el inicio de todos modos), o variables que se han marcado como de solo lectura.-ves para el shell Bourne ybashcuyounsetsin-vpodría desarmar unaENV_VARfunció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-fopción. (Es poco probable que haga una diferencia en la práctica).(También tenga cuidado con el error / mal funcionamiento de
bash/mksh/yashcuyounset, bajo ciertas circunstancias, no puede desarmar la variable, pero revela la variable en un ámbito externo )Si
perlestá 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),
localque 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 enmkshoyash(entypesetlugar de hacerlolocal) ya que eso no funcionaría,unsetsolo estaría cancelando ellocal.¹ También tenga en cuenta que en
bashel localENV_VAR(aunque no esté configurado) retendría el atributo de exportación . Entonces, sicommandse 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_VARborraría ese atributo. O puede usar ellocal +x ENV_VARque 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.commandes el último comando en la invocación de subshell.env -u.Puedes usar
ENV_VAR= commandEn realidad, esto no desarma la variable, pero puede ser útil en muchos casos (los scripts de shell generalmente solo se usan
test -npara verificar si una variable está configurada):fuente