Bash sembra distinguere tra le variabili che sono state esportate e quelle che non lo sono state.
esempio:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set
vede la variabile ma env
no.
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
set
vede entrambe le variabili ma env
vede solo la variabile esportata.
Conosco quel set
è un builtin bash e env
non lo è.
Quali sono le differenze tra le variabili esportate e quelle che non lo sono?
Risposta accettata:
Le variabili esportate vengono trasferite nell'ambiente dei comandi eseguiti dalla shell che le ha esportate, mentre le variabili non esportate sono locali rispetto alla chiamata della shell corrente. Da export
pagina man:
La shell darà l'attributo export alle variabili corrispondenti ai nomi specificati, il che farà sì che si trovino nell'ambiente dei comandi eseguiti successivamente.
set
restituisce l'ambiente corrente, che include tutte le variabili locali non esportate. env
viene utilizzato per avviare programmi in un nuovo ambiente e senza argomenti produrrà quale sarebbe il nuovo ambiente. Da env
sta creando un nuovo ambiente, vengono portate solo le variabili esportate, come nel caso di qualsiasi programma avviato da quella shell. Ad esempio, generando una seconda shell all'interno della prima (ho usato $$
per rappresentare i prompt nella shell interna):
$ FOO=BAR
$ bash
$$ echo $FOO # Note the empty line
$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$
Nota che è la variabile che viene esportata, non solo il suo valore. Ciò significa che una volta export FOO
, FOO
diventa una variabile globale e compare negli ambienti successivi, anche se modificata in seguito:
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$