En Mac 10.11.6, usando GNU bash, versión 3.2.57(1)-release (x86_64-apple-darwin15) el set +a
el comando parece no funcionar:
script.py
#!/usr/bin/python
import os
print("VAR0 is:", os.environ.get("VAR0")
Comandos:
$ VAR0=abc
$ ./script.py
('VAR0 is:', None) # expected
$ set -a
$ VAR0=abc
$ ./script.py
('VAR0 is:', 'abc') # expected, VAR0 has been exported to the environment and script.py has access to it
$ set +a
$ VAR0=def
$ ./script.py
('VAR0 is:', 'def') # <= unexpected
Respuesta aceptada:
Para llevar:Sí, set +a
desarma set -a
pero las variables no se dejan de exportar por eso. Luego, cada variable debe ser exportada o desarmada.
La opción allexport
(Igual que set -a
) permite la exportación automática de nuevo y cambiado variables Variables que existen antes de activar el set -a
la opción no se exportará.
Dos puntos antes de la prueba:
-
La condición de
set -a
podría imprimirse conshopt -po allexport
.
Y podría cambiarse conshopt -os allexport
yshopt -ou allexport
.$ shopt -po allexport set +o allexport $ set -a $ shopt -po allexport set -o allexport $ set +a $ shopt -po allexport set +o allexport
-
La forma de shell para probar las variables de entorno es examinar la salida del
environment
comando, en realidad agrep
es$ env | grep PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
No es necesario un programa externo de python (que necesita compilarse en la primera llamada). Todavía puede usarlo si eso lo hace feliz, pero no hay una necesidad real de eso.
Si la opción no está configurada (set +a
). Un nuevo la variable no ser exportado.
$ unset VAR0
$ VAR0=abc
$ env | grep VAR0
# nothing is printed.
O, si aún desea su programa:
$ ./envtest.py
VAR0 is: None
Si el -a
se cambia la opción, la var no se exportará hasta que se cambie:
$ set -a
$ shopt -po allexport
set -o allexport
$ env | grep VAR0
$ ./envtest.py
VAR0 is: None
Si la variable cambia:
$ VAR0=bcd
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd
Pero la variable permanecerá en el entorno si el set +a
se aplica:
$ set +a
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd
Incluso si se cambia la var, sigue siendo parte del entorno:
$ VAR0=xyz
$ env | grep VAR0
VAR0=xyz
$ ./envtest.py
VAR0 is: xyz
Hasta que no se exporte (elimine el atributo de exportación):
$ declare +x VAR0
O simplemente está unset
$ env | grep VAR0
VAR0=xyz
$ unset VAR0
$ env | grep VAR0
No, asignar un valor vacío no es lo mismo:
$ VAR0=''
$ env | grep VAR0
VAR0=
Que su programa no muestra eso claramente:
$ ./envtest.py
VAR0 is: