GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Setzen von +a setzt das -a-Flag nicht zurück?

Auf Mac 10.11.6 unter Verwendung von GNU Bash, Version 3.2.57(1)-Release (x86_64-apple-darwin15) set +a Befehl scheint nicht zu funktionieren:

script.py

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

Befehle:

$ 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

Akzeptierte Antwort:

Fazit:Ja, set +a setzt set -a zurück aber Variablen werden dadurch nicht unexportiert. Jede Variable muss dann nicht exportiert oder nicht gesetzt werden.

Die Option allexport (Das gleiche wie set -a ) ermöglicht den automatischen Export von new und geändert Variablen. Variablen, die vor der Aktivierung des set -a vorhanden sind Option wird nicht exportiert.

Zwei Punkte vor dem Testen:

  1. Die Bedingung von set -a könnte mit shopt -po allexport gedruckt werden .
    Und kann mit shopt -os allexport geändert werden und 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. Die Shell-Methode zum Testen von Umgebungsvariablen besteht darin, die Ausgabe von environment zu untersuchen Befehl, eigentlich zu grep es

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

Kein externes Programm von Python erforderlich (das beim ersten Aufruf kompiliert werden muss). Du kannst es immer noch verwenden, wenn es dich glücklich macht, aber es gibt keinen wirklichen Grund dafür.

Wenn die Option nicht gesetzt ist (set +a ). Ein neues Variable wird nicht exportiert werden.

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

Oder, wenn Sie Ihr Programm noch wollen:

$ ./envtest.py
VAR0 is: None

Wenn der -a Option geändert wird, wird die var nicht exportiert, bis sie geändert wird:

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

Wenn sich die Variable ändert:

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

Aber die Variable bleibt in der Umgebung, wenn set +a angewendet wird:

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

Selbst wenn die var geändert wird, ist sie immer noch Teil der Umgebung:

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

Bis es entweder nicht exportiert wird (entfernen Sie das Exportattribut):

$ declare +x VAR0

Oder es ist einfach unset

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

Nein, das Zuweisen eines leeren Werts ist nicht dasselbe:

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

Was Ihr Programm nicht so deutlich zeigt:

$ ./envtest.py
VAR0 is: 

Linux
  1. Der registrierte Rückruf stimmt nicht mit der angegebenen URL überein – WSO2-Fehler behoben

  2. Warum funktioniert der reguläre Ausdruck in X, aber nicht in Y?

  3. Warum liefert `md5sum` nicht den gleichen Hash wie das Internet?

  4. Warum ändert der folgende Weg die Größe der Kerndatei nicht?

  5. Wo wird die Term-Umgebungsvariable Default gesetzt?

So richten Sie den Pretty Hostnamen ein

Gnome-Shell:Drücken der Supertaste funktioniert nicht?

Was macht hier das '-' (Bindestrich) nach Variablennamen?

tmux Strg+B funktioniert nicht

Wie setze ich eine Datei als NICHT ausführbar?

Automatische Wiederholung funktioniert nicht