Ho creato una variabile dambiente in una finestra del terminale e ho provato a visualizzarla in unaltra finestra del terminale. Non mostrava nulla.
$TEST=hello
Dopodiché lho esportato e ho provato di nuovo a echo
in una finestra di terminale diversa . il risultato era lo stesso di prima.
export TEST
ma se eseguo lo stesso codice allaccesso (aggiungendo il codice a ~/.profile
file) è possibile utilizzare qualsiasi finestra di terminale. Cosa sta succedendo qui? Qual è la differenza tra lesecuzione di un codice in un terminale e lesecuzione dello stesso allaccesso?
Answer
export
crea una variabile che verrà inclusa negli ambienti dei processi figlio. Non influisce su altri ambienti già esistenti. In generale non cè un modo per impostare una variabile in un terminale e farlo apparire automaticamente in un altro terminale, lambiente viene stabilito per ogni processo da solo.
Aggiungendolo al tuo .profile
fa in modo che il tuo ambiente sia configurato per includere quella nuova variabile ogni volta che accedi. Quindi non viene esportata da una shell allaltra, ma invece istruisce una nuova shell da includere quando imposta lambiente iniziale.
Risposta
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. Al momento della creazione del processo (tramite la chiamata di sistema fork()
) il bambino eredita questi attributi dal genitore. Dopo questo il processo figlio può impostare questi attributi arbitrariamente. (Si applicano alcune limitazioni, un processo potrebbe non aumentare i limiti delle risorse rigide o cambiare la sua directory corrente in una directory per la quale non ha i permessi di esecuzione.)
Solo pochi programmi modificano le loro variabili dambiente, la maggior parte non si preoccupa . Supponiamo il secondo caso. Quindi, se un processo figlio crea se stesso ulteriori figli, allora questi processi avranno le stesse variabili dambiente dei nonni. E così via.
Ora, una shell ha molte variabili che possono essere visualizzate con set
(nelle shell di tipo Bourne Shell, non so riguardo alla shell C). Queste variabili non sono variabili di ambiente a meno che non siano export
ed. Le variabili dambiente possono essere visualizzate con env
. Se avvii un programma dalla riga di comando della shell, il programma erediterà le variabili dambiente dalla shell. Allo stesso modo per un programma avviato da uno script di shell.
Pertanto, al momento del login cè una shell che legge i dati del profilo (ad esempio ~/.profile
) e li eredita praticamente da tutti i figli, nipoti e così via. Questo è il modo in cui le impostazioni delle variabili di ambiente scorrono dalla shell di accesso o dallo script di accesso a tutti gli altri programmi avviati allinterno della sessione di accesso.
Ho creato una variabile di ambiente in una finestra di terminale e ho provato a visualizzarla in unaltra finestra di terminale. Non mostrava nulla.
Secondo la spiegazione precedente, questo è il risultato atteso. Le modifiche nellambiente di un processo interessano solo i figli di questo processo che vengono creati dora in poi, non quelli esistenti.
$TEST=hello
È improbabile che funzioni comunque, a meno che lespansione della variabile non sia disabilitata o $TEST
abbia già un valore adeguato. Se desideri assegnare hello
alla variabile TEST
devi dire TEST=hello
(nota : no $
).
Dopodiché lho esportato e ho provato di nuovo a
echo
in una finestra di terminale diversa. il risultato era lo stesso di prima.
Ancora una volta, questo è il risultato atteso.
ma se eseguo lo stesso codice al login (aggiungendo il codice al file
~/.profile
) le variabili possono essere utilizzate qualsiasi finestra di terminale.
Questo perché la shell nel terminale è un discendente della shell che legge le impostazioni dellambiente da ~/.profile
e quindi ha ereditato queste impostazioni.