A che serve il comando "export"?


12

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.

$TEST=hello

Successivamente l'ho esportato e riprovato echoin un'altra finestra del terminale. il risultato è stato lo stesso di prima.

export TEST 

ma se eseguo lo stesso codice al login (aggiungendo il codice al ~/.profilefile) le variabili possono essere utilizzate in qualsiasi finestra del terminale. Cosa sta succedendo qui? Qual è la differenza tra l'esecuzione di un codice in un terminale e l'esecuzione dello stesso all'accesso?

Risposte:


25

exportrende una variabile qualcosa che verrà inclusa negli ambienti di processo figlio. Non influisce su altri ambienti già esistenti. In generale non esiste un modo per impostare una variabile in un terminale e farlo apparire automaticamente in un altro terminale, l'ambiente è stabilito per ogni processo da solo.

L'aggiunta al tuo .profilerende tale che l'ambiente verrà impostato per includere quella nuova variabile ogni volta che accedi. Quindi non viene esportato da una shell a un'altra, ma indica invece a una nuova shell di includerla quando imposta l'ambiente iniziale.


1

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 $TESTabbia già un valore adatto. Se vuoi assegnare helloa una variabile, TESTallora devi dire TEST=hello(nota: no $).

Successivamente l'ho esportato e riprovato echoin 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 ~/.profilefile) 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 ~/.profilee quindi ha ereditato queste impostazioni.

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.