Variabile d'ambiente vs variabile Shell, qual è la differenza?


Risposte:


35

$BASHè una variabile locale valida solo nella shell corrente (bash).

Le variabili di ambiente come $SHELLsono valide in tutto il sistema. In una shell Bash corrente, $BASHpunta al percorso di esecuzione di bash , mentre $SHELLpunta alla shell definita come predefinita (che può avere lo stesso valore).

Per una spiegazione delle variabili di ambiente, consultare Variabili di ambiente nella Guida di Ubuntu.


1
Un ottimo collegamento (+1) :)
Peter.O

12
Questa risposta è errata / inaccurata. Le variabili di ambiente NON sono globali / a livello di sistema. Le variabili della shell sono private per la shell attualmente in esecuzione e NON vengono esportate (passate) a nessun processo figlio. Le variabili di ambiente vengono esportate in qualsiasi processo figlio. "MYVAR = private; export OURVAR = shared; printenv" riporta solo "OURVAR" perché quando la shell esegue il comando printenv, esporta OURVAR, ma non MYVAR.
CM

2
+1 al commento di CM! Non ho mai sentito la differenza spiegata in modo così semplice e preciso !!! Questo commento dovrebbe essere la risposta.
Jesse the Wind Wanderer,

48

Una variabile d'ambiente è disponibile a livello globale, in un programma e in programmi figlio. Una variabile di shell è disponibile solo nella shell corrente. Per rendere disponibile una variabile shell come variabile d'ambiente, usare export VARNAME(senza dollaro $).

Esempi di chiarimenti:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Un altro modo per definire una variabile d'ambiente:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE

Non penso sia corretto. exportnon imposta necessariamente una variabile d'ambiente. stackoverflow.com/questions/7411455/...
Chris Stryczynski

3
@ChrisStryczynski exportimposta una variabile di ambiente per i processi figlio. Il post che hai collegato non contraddice questa risposta, potresti chiarire perché pensi che sia sbagliato?
Lekensteyn,

exportimposta assolutamente una variabile d'ambiente
David Tonhofer,

9

C'è una differenza. Variabili di shell e variabili di ambiente spiegheranno meglio che posso, ma ecco un estratto da esso:

Se viene apportata una modifica a una variabile di shell, deve essere esplicitamente "esportata" nella corrispondente variabile di ambiente affinché tutti i sottoprocessi biforcati possano vedere la modifica. Ricorda che le variabili della shell sono locali alla shell in cui sono state definite.


Sto commentando la mia risposta .. Mi piace molto il link Aiuto Ubuntu nella risposta di Takkat ... (è meglio della mia)
Peter.O

3
Inoltre il tuo link non funziona più!

1

Variabile della shell: a breve termine, applicata solo all'istanza corrente della shell, non applicabile a livello di sistema

Variabile ambientale: uso a lungo termine, sistema valido ampio, consentito a livello globale

Per convenzione, le variabili Shell hanno il loro nome in minuscolo mentre Envn. Le variabili sono scritte in maiuscolo


-1

Per rispondere a questa domanda, prima prova a capire l'ambito di una variabile.

Quando si crea una nuova variabile come SOME_ENV_VARIABLE="testing.txt"se risieda in SHELL scope, ciò significa che è possibile accedervi da quell'istanza della shell in cui l'utente ha effettuato l'accesso. Quando l'istanza cambia ad esempio si apre un nuovo terminale o si cambia la shell (ad esempio passa a csh) non puoi accedere a quella variabile.

Quando si esporta quella variabile come export SOME_ENV_VARIABLEquella variabile è ora disponibile nell'ambito dell'ambiente, ciò significa che se si modifica la shell è comunque possibile accedere a quella variabile. Proviamo a capire con il seguente esempio:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Analogia: supponiamo che tu abbia un appartamento con due camere da letto e lo condividi con un altro compagno di stanza. L'area comune è accessibile a tutti ma non alle camere da letto, la variabile d'ambiente è come l'area comune e la variabile shell è come la camera da letto, se vuoi qualcosa nell'area comune a cui può accedere chiunque ma se lo tieni nella tua camera da letto può solo essere accessibile da te.

Ricorda che se apri un nuovo terminale non sarai in grado di accedere a nessuna delle variabili perché stai modificando quell'istanza . Per questo dovresti aggiungere le tue variabili in uno .profileo .bashrc(se stai usando bash).

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.