it-swarm.it

Cosa fa "export" nella programmazione Shell?

Per quanto ne so, l'assegnazione delle variabili è la stessa sia che sia preceduta o meno da "export". Per cosa è?

109
John Bachir

Variabili esportate come $HOME e $PATH sono disponibili per (ereditati da) altri programmi eseguiti da Shell che li esporta (e i programmi eseguiti da quegli altri programmi e così via) come variabili di ambiente. Le variabili regolari (non esportate) non sono disponibili per altri programmi.

$ env | grep '^variable='
$                                 # No environment variable called variable
$ variable=Hello                  # Create local (non-exported) variable with value
$ env | grep '^variable='
$                                 # Still no environment variable called variable
$ export variable                 # Mark variable for export to child processes
$ env | grep '^variable='
variable=Hello
$
$ export other_variable=Goodbye   # create and initialize exported variable
$ env | grep '^other_variable='
other_variable=Goodbye
$

Per ulteriori informazioni, vedere la voce per export builtin nel GNU manuale di Bash, e anche le sezioni su ambiente di esecuzione del comando e ambiente .

Si noti che le variabili non esportate saranno disponibili per i subshells eseguiti tramite ( ... ) e notazioni simili perché quei subshells sono cloni diretti della Shell principale:

$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$

La subshell può cambiare la propria copia di qualsiasi variabile, esportata o meno, e può influenzare i valori visti dai processi che esegue, ma le modifiche della subshell non possono influenzare la variabile nella Shell madre, ovviamente.

Alcune informazioni sui subshells sono disponibili in raggruppamento di comandi e ambiente di esecuzione dei comandi nel manuale di Bash.

126
Jonathan Leffler

rende il compito visibile ai sottoprocessi.

[email protected]:~/rentacoder/bin2txt$ foo=bar
[email protected]:~/rentacoder/bin2txt$ bash -c 'echo $foo'

[email protected]:~/rentacoder/bin2txt$ export foo
[email protected]:~/rentacoder/bin2txt$ bash -c 'echo $foo'
bar
54
jcomeau_ictx

Bene, dipende generalmente dalla Shell. Per bash, contrassegna la variabile come "esportabile", il che significa che verrà visualizzata nell'ambiente per tutti i processi figlio eseguiti.

Le variabili non esportate sono visibili solo dal processo corrente (Shell).

Dalla pagina man bash:

export [-fn] [name[=Word]] ...
export -p

I nomi forniti sono contrassegnati per l'esportazione automatica nell'ambiente di comandi eseguiti successivamente.

Se viene fornita l'opzione -f, I nomi si riferiscono alle funzioni. Se non viene fornito alcun nome o viene fornita l'opzione -p, Viene stampato un elenco di tutti i nomi esportati in questa shell.

L'opzione -n Fa sì che la proprietà di esportazione venga rimossa da ciascun nome.

Se un nome di variabile è seguito da =Word, Il valore della variabile è impostato su Word.

export restituisce uno stato di uscita pari a 0 a meno che non venga rilevata un'opzione non valida, uno dei nomi non sia un nome di variabile Shell valido o -f viene fornito con un nome che non è una funzione.

Puoi anche impostare le variabili come esportabili con il comando typeset e contrassegnare automaticamente tutte le future creazioni o modifiche delle variabili come tali, con set -a.

17
paxdiablo