Differenza tra variabile di ambiente e variabile di shell


8

Si dice che le variabili di ambiente siano ereditate nei processi secondari, ma non le variabili di shell. Tuttavia, il seguente test mostra che le variabili di shell sono viste nel processo figlio proprio come variabili di ambiente. Qual è la differenza?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST

Risposte:


9

Il tuo secondo incarico TEST="SHELL_TEST"non annulla l'esportazione della variabile. È ancora contrassegnato come "essere ereditato dai bambini". E il valore ereditato dal figlio è il valore attualmente impostato nel genitore.
In altre parole, la seconda assegnazione non ripristina lo stato di TESTuna variabile di shell, è comunque una variabile di ambiente in base a tale terminologia.

Dovresti annullare l'esportazione per renderlo non impostato nei processi secondari:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$

Ciao Mat, grazie per la tua risposta. Quindi la mia comprensione (ci sono due variabili denominate TEST, una per la variabile di ambiente e una per la variabile di shell, shell var TEST shadows env var TEST.) Non è corretta, c'è solo una variabile in Bash, è sempre una variabile di shell e può essere impostato per essere esportato e funge da variabile d'ambiente. È specifico per Bash e dipende dall'implementazione, oppure è universale in tutte le shell. Grazie.
ning

Non sono sicuro di "universale", ma funziona allo stesso modo con bash, ksh e zsh almeno.
Mat

2
@ning Ecco come funzionano tutte le moderne shell POSIX / Bourne (ash, ksh, bash, zsh). Esistevano versioni antiche della shell Bourne in cui la modifica di una variabile shell esportata non cambiava il valore nell'ambiente, ma è improbabile che le incontri più. Csh funziona in modo diverso, potresti ancora riscontrarlo in ambienti vecchio stile ma anche per un po 'è stato obsoleto.
Gilles 'SO- smetti di essere malvagio' il

@Gilles Grazie per aver chiarito cosa sta succedendo e perché. Come qualcuno ha detto, ogni sviluppatore Unix dovrebbe anche essere uno storico.
ning
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.