Risposte:
$BASH
è una variabile locale valida solo nella shell corrente (bash).
Le variabili di ambiente come $SHELL
sono valide in tutto il sistema. In una shell Bash corrente, $BASH
punta al percorso di esecuzione di bash , mentre $SHELL
punta 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.
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
export
non imposta necessariamente una variabile d'ambiente. stackoverflow.com/questions/7411455/...
export
imposta una variabile di ambiente per i processi figlio. Il post che hai collegato non contraddice questa risposta, potresti chiarire perché pensi che sia sbagliato?
export
imposta assolutamente una variabile d'ambiente
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.
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
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_VARIABLE
quella 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 .profile
o .bashrc
(se stai usando bash).