Cosa fa l'esportazione in BASH? [duplicare]


75

Possibile duplicato:
differenza tra “a = b” e “export a = b” in bash

È difficile da ammettere, ma non ho mai veramente capito cosa exportfa esattamente una variabile d'ambiente. So che se non esporto una variabile a volte non riesco a vederla nei processi figlio, ma a volte sembra di poterlo fare. Cosa sta succedendo davvero quando dico

export foo=5

e quando non dovrei esportare una variabile?


Ecco un link ad almeno un'altra domanda utile su questo argomento: superuser.com/questions/143413/linux-environment-variables ... dal momento che ironicamente questa domanda è stata la prima che è spuntata su Google per la mia query sull'esportazione in bash .
Ogre Salmo33


Un uso comune è aggiungere exportistruzioni a .bashrc / .bash_profile per creare variabili globali persistenti simili a $HOME.
Evan Plaice,

Attento, c'è di più in questa storia di quanto appaia inizialmente. Ti invito a controllare la mia risposta.
Jasonleonhard,

Risposte:


15

Da man bash:

AMBIENTE

Quando viene invocato un programma, viene assegnato un array di stringhe chiamato ambiente. Questo è un elenco di coppie nome-valore, della forma nome = valore.

La shell offre diversi modi per manipolare l'ambiente. All'invocazione, la shell esegue la scansione del proprio ambiente e crea un parametro per ciascun nome trovato, contrassegnandolo automaticamente per l'esportazione in processi figlio. I comandi eseguiti ereditano l'ambiente. I comandi export e declare -xconsentono di aggiungere e cancellare dall'ambiente parametri e funzioni. Se il valore di un parametro nell'ambiente viene modificato, il nuovo valore diventa parte dell'ambiente, sostituendo il vecchio. L'ambiente ereditato da qualsiasi comando eseguito è l'ambiente iniziale della shell, i cui valori possono essere modificati nella shell, meno eventuali coppie rimosse dal unset comando, oltre a eventuali aggiunte tramite l'esportazione e i declare -xcomandi.


74
L'IMHO che copia e incolla un estratto dalla documentazione senza ulteriori sforzi di spiegazione non dovrebbe essere votato.
Artur,

30
Questo estratto non è molto chiaro e francamente non ho capito cosa sta succedendo.
Trismegisto

4
@Artur: al contrario: se la documentazione (estratto dalla) risponde a una domanda, preferirei non avere ulteriori spiegazioni.
René Nyffenegger,

1
@ RenéNyffenegger ma sembra, non è così. Almeno, non l'ho ricevuto fino a quando non ho letto una risposta di BloodPhilia che dovrebbe essere contrassegnata come accettata.
Vladislav Rastrusny,

1
Credo che i punti sollevati da Artur e Trismegistos siano che chiunque può copiare incolla, non è sempre abbastanza, chiarire e fornire una buona risposta. Va bene copiare incollare un po 'di documentazione o fornire un collegamento, in effetti è incoraggiato, ma dovrebbe esserci qualche spiegazione aggiuntiva sulla qualità. Inoltre, questa spiegazione può essere facilmente ignorata da persone come RenéNyffenegger se non ne hanno bisogno, ma sarà lì per coloro che ne trarranno beneficio. Stiamo tutti cercando di apprendere e abbiamo modi diversi di ottenere comprensione, questo aiuta a coprire una varietà di stili di apprendimento e migliorerà la tua valutazione.
Jasonleonhard,

99

Le variabili esportate vengono passate ai processi figlio, mentre le variabili non esportate no.


Puoi indicare qualsiasi documentazione in merito. Sto cercando più informazioni di così. Ad esempio, una variabile deve essere esportata una sola volta oppure è necessario esportarla dopo ogni modifica, ecc.
Chas. Owens,


3
Puoi verificarlo aggiungendo qualcosa a un percorso (diciamo a PYTHONPATH) e poi notando che, sebbene sia possibile echo $PYTHONPATH, non viene riconosciuto dagli script Python o Bash fino a quando non exportlo fai
Kaushik Ghose,

Anche questa risposta non sembra essere del tutto vera. Le sub-shell di Bash, ad esempio, riguardano processi secondari (secondo $BASHPID) e tuttavia è possibile leggere variabili non esportate dalla shell padre. Prova semplice: la x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") mia ipotesi è che questo è un caso speciale che si verifica quando il processo figlio è una sotto-shell.
JepZ,

20

Quando si utilizza export, si aggiunge la variabile all'elenco delle variabili di ambiente della shell in cui è stato chiamato il comando export e tutte le variabili di ambiente di una shell vengono passate ai processi figlio, ecco perché è possibile utilizzarlo.

Quando finisci la shell il suo ambiente viene distrutto, ecco perché le variabili di ambiente vengono dichiarate ed esportate all'accesso, ad esempio nel file .bashrc

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.