GNU/Linux >> Tutoriales Linux >  >> Linux

¿Establecer +a no desarma la bandera -a?

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:

  1. La condición de set -a podría imprimirse con shopt -po allexport .
    Y podría cambiarse con shopt -os allexport y shopt -ou allexport .

    $ shopt -po allexport
    set +o allexport
    
    $ set -a
    $ shopt -po allexport
    set -o allexport
    
    $ set +a
    $ shopt -po allexport
    set +o allexport
    
  2. La forma de shell para probar las variables de entorno es examinar la salida del environment comando, en realidad a grep 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: 

Linux
  1. La devolución de llamada registrada no coincide con la URL proporcionada:corrija el error de WSO2

  2. ¿Por qué la expresión regular funciona en X pero no en Y?

  3. ¿Dónde se establece el término valor predeterminado de la variable de entorno?

  4. ¿Por qué `exit &` no funciona?

  5. Emulator -avd no inicia el dispositivo virtual?

Cómo configurar el nombre de host bonito

¿Por qué el archivo de traducción de Bash no contiene todos los textos de error?

Gnome Shell:¿Presionar la tecla Super no funciona?

El comando sed de Linux no cambia el archivo de destino

tmux Ctrl+B no funciona

¿Cómo configurar un archivo como NO ejecutable?