Ogni processo ha diversi attributi che il processo può impostare individualmente e indipendentemente da altri processi. Esempi sono limiti di risorse, umask, directory corrente, variabili di ambiente e altro ancora. Alla creazione del processo (tramite la fork()
chiamata di sistema) il figlio eredita questi attributi dal genitore. Successivamente, il processo figlio può impostare arbitrariamente questi attributi. (Si applicano alcune restrizioni, un processo potrebbe non aumentare i limiti delle risorse rigide o modificare la directory corrente in una directory per la quale non dispone dell'autorizzazione exec.)
Solo pochi programmi modificano le loro variabili di ambiente, la maggior parte non si preoccupa. Supponiamo che quest'ultimo caso. Quindi se un processo figlio crea se stesso ulteriori figli, questi processi avranno le stesse variabili d'ambiente del nonno. E così via.
Ora, una shell ha molte variabili che possono essere visualizzate con set
(nelle shell di tipo Bourne Shell, non so di C Shell). Queste variabili non sono variabili di ambiente a meno che non vengano modificate export
. Le variabili d'ambiente possono essere visualizzate con env
. Se si avvia un programma dalla riga di comando della shell, il programma erediterà le variabili di ambiente dalla shell. Allo stesso modo per un programma lanciato da uno script di shell.
Pertanto, al momento del login c'è una shell che legge i dati del profilo (ad es. ~/.profile
) E li eredita praticamente da tutti i bambini, i nipoti e così via. Questo è il modo in cui le impostazioni delle variabili di ambiente scendono dalla shell di accesso o dallo script di accesso a tutti gli altri programmi avviati durante la sessione di accesso.
Ho creato una variabile d'ambiente in una finestra del terminale e ho provato a riecheggiarla in un'altra finestra del terminale. Non ha mostrato nulla.
Con la spiegazione sopra, questo è il risultato atteso. I cambiamenti nell'ambiente di un processo riguardano solo i figli di questo processo che vengono creati da ora in poi, non quelli esistenti.
$TEST=hello
È improbabile che ciò funzioni comunque, a meno che l'espansione variabile non sia disabilitata o $TEST
abbia già un valore adatto. Se vuoi assegnare hello
a una variabile, TEST
allora devi dire TEST=hello
(nota: no $
).
Successivamente l'ho esportato e riprovato echo
in un'altra finestra del terminale. il risultato è stato lo stesso di prima.
Ancora una volta, questo è il risultato atteso.
ma se eseguo lo stesso codice al login (aggiungendo il codice al ~/.profile
file) le variabili possono essere utilizzate in qualsiasi finestra del terminale.
Questo perché la shell nel terminale è un discendente della shell che legge le impostazioni dell'ambiente ~/.profile
e quindi ha ereditato queste impostazioni.