GNU/Linux >> Linux Esercitazione >  >> Linux

Imposta +a non disattiva il flag -a?

Su Mac 10.11.6, usando GNU bash, versione 3.2.57(1)-release (x86_64-apple-darwin15) il set +a il comando sembra non funzionare:

script.py

#!/usr/bin/python
import os
print("VAR0 is:", os.environ.get("VAR0")

Comandi:

$ 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

Risposta accettata:

Take away:Sì, set +a disimposta set -a ma le variabili non vengono esportate per questo motivo. Ciascuna variabile deve quindi essere annullata o annullata.

L'opzione allexport (Come set -a ) consente l'esportazione automatica di nuovo e cambiato variabili. Variabili che esistono prima dell'attivazione del set -a l'opzione non verrà esportata.

Due punti prima del test:

  1. La condizione di set -a potrebbe essere stampato con shopt -po allexport .
    E potrebbe essere modificato con shopt -os allexport e 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. Il metodo shell per testare le variabili d'ambiente consiste nell'esaminare l'output dell'environment comando, in realtà in grep esso

    $ env | grep PATH
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    

Non c'è bisogno di un programma esterno da Python (che deve essere compilato alla prima chiamata). Puoi ancora usarlo se questo ti rende felice, ma non ce n'è davvero bisogno.

Se l'opzione non è impostata (set +a ). Un nuovo la variabile non essere esportato.

$ unset VAR0
$ VAR0=abc
$ env | grep VAR0
                      # nothing is printed.

Oppure, se vuoi ancora il tuo programma:

$ ./envtest.py
VAR0 is: None

Se il -a opzione viene modificata, la var non verrà esportata fino a quando non viene modificata:

$ set -a
$ shopt -po allexport
set -o allexport
$ env | grep VAR0
$ ./envtest.py
VAR0 is: None

Se la variabile cambia:

$ VAR0=bcd
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

Ma la variabile rimarrà nell'ambiente se il set +a è applicato:

$ set +a
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

Anche se la var viene modificata, fa ancora parte dell'ambiente:

$ VAR0=xyz
$ env | grep VAR0
VAR0=xyz
$ ./envtest.py
VAR0 is: xyz

Finché non viene esportato (rimuovere l'attributo export):

$ declare +x VAR0

Oppure è semplicemente unset

$ env | grep VAR0
VAR0=xyz
$ unset VAR0
$ env | grep VAR0

No, assegnare un valore vuoto non è lo stesso:

$ VAR0=''
$ env | grep VAR0
VAR0=

Che il tuo programma non mostra chiaramente:

$ ./envtest.py
VAR0 is: 

Linux
  1. La richiamata registrata non corrisponde all'URL fornito – Correzione dell'errore WSO2

  2. Perché l'espressione regolare funziona in X ma non in Y?

  3. Perché `md5sum` non fornisce lo stesso hash di Internet?

  4. Perché il modo seguente non cambia la dimensione del limite del file principale?

  5. Dove viene impostato il termine Default della variabile di ambiente?

Come impostare il nome host Pretty

Perché il file di traduzione Bash non contiene tutti i testi di errore?

Gnome Shell:premere il tasto Super non funziona?

tmux Ctrl+B non funziona

Come impostare un file come NON eseguibile?

La ripetizione automatica non funziona