Differenza tra variabili shell che vengono esportate e quelle che non sono in bash


41

Bash sembra distinguere tra variabili che sono state esportate e quelle che non lo sono.

esempio:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

setvede la variabile ma envnon lo fa.

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

setvede entrambe le variabili ma envvede solo la variabile esportata.

So che setè incorporato in Bash e envnon lo è.

Quali sono le differenze tra le variabili che vengono esportate e quelle che non lo sono?


17
Nota terminologica: viene sempre esportata una "variabile d'ambiente". Una variabile non esportata è una "variabile di shell" (o "parametro").
Gilles 'SO- smetti di essere malvagio' il

Risposte:


44

Le variabili esportate vengono trasportate nell'ambiente dei comandi eseguiti dalla shell che le ha esportate, mentre le variabili non esportate sono locali per l'invocazione della shell corrente. Dalla exportpagina man:

La shell fornisce l'attributo di esportazione alle variabili corrispondenti ai nomi specificati, che devono far sì che si trovino nell'ambiente di comandi eseguiti successivamente.

setgenera l'ambiente corrente, che include eventuali variabili locali non esportate. envviene utilizzato per avviare programmi in un nuovo ambiente e senza argomenti genererà quello che sarebbe quel nuovo ambiente. Poiché envsta 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 (in passato $$rappresentavo 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 diventato export FOO, FOOdiventa una variabile globale e viene visualizzato negli ambienti successivi, anche se modificato in seguito:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$

quindi se sei preoccupato solo per la shell corrente, devi esportare? Separatamente, perché localela shell corrente non dovrebbe mostrare gli aggiornamenti?
Pacerier
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.