GNU/Linux >> Znalost Linux >  >> Linux

Nastavení +a Nezruší nastavení příznaku -a?

Na Macu 10.11.6 pomocí GNU bash, verze 3.2.57(1)-release (x86_64-apple-darwin15) set +a Zdá se, že příkaz nefunguje:

script.py

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

Příkazy:

$ 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

Přijatá odpověď:

Take away:Ano, set +a unsets set -a ale proměnné se kvůli tomu nestanou neexportovanými. Každou proměnnou je pak třeba zrušit exportování nebo zrušit nastavení.

Možnost allexport (Stejné jako set -a ) umožňuje automatický export nových a změněno proměnné. Proměnné, které existují před aktivací set -a možnost nebude exportována.

Dva body před testováním:

  1. Podmínka set -a lze vytisknout pomocí shopt -po allexport .
    A může být změněno pomocí shopt -os allexport a 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. Shell způsob, jak testovat proměnné prostředí, je prozkoumat výstup environment ve skutečnosti do grep to

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

Není potřeba externí program z pythonu (který vyžaduje kompilaci při prvním volání). Můžete jej stále používat, pokud vám to dělá radost, ale není to ve skutečnosti potřeba.

Pokud možnost není nastavena (set +a ). Nové proměnná nebude být exportován.

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

Nebo, pokud stále chcete svůj program:

$ ./envtest.py
VAR0 is: None

Pokud -a změníte, var nebude exportována, dokud nebude změněna:

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

Pokud se proměnná změní:

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

Ale proměnná zůstane v prostředí, pokud set +a je použito:

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

I když se var změní, je stále součástí prostředí:

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

Dokud nebude exportován (odstraňte atribut export):

$ declare +x VAR0

Nebo je jednoduše unset

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

Ne, přiřazení prázdné hodnoty není totéž:

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

Což váš program tak jasně neukazuje:

$ ./envtest.py
VAR0 is: 

Linux
  1. Proč regulární výraz funguje v X, ale ne v Y?

  2. Proč `md5sum` nedává stejný hash jako internet?

  3. Proč následující způsob nezmění velikost základního souboru?

  1. Proč překladový soubor Bash neobsahuje všechny chybové texty?

  2. Proč „ukončit &“ nefunguje?

  3. Příkaz sed pro Linux nemění cílový soubor

  1. Co zde dělá '-' (pomlčka) za názvy proměnných?

  2. tmux Ctrl+B nefunguje

  3. Jak nastavit soubor jako NENÍ spustitelný?