Variabili della shell
Le variabili di shell sono variabili il cui ambito è nella sessione di shell corrente, ad esempio in una sessione di shell interattiva o in uno script.
È possibile creare una variabile di shell assegnando un valore a un nome non utilizzato:
var="hello"
L'uso delle variabili della shell è di tenere traccia dei dati nella sessione corrente. Le variabili shell di solito hanno nomi con lettere minuscole.
Variabili ambientali
Una variabile di ambiente è una variabile di shell che è stata esportata. Ciò significa che sarà visibile come variabile, non solo nella sessione della shell che l'ha creata, ma anche per qualsiasi processo (non solo shell) avviato da quella sessione.
VAR="hello" # shell variable created
export VAR # variable now part of the environment
o
export VAR="hello"
Una volta che una variabile shell è stata esportata, rimane esportata fino a quando non viene disattivata o fino a quando la sua "proprietà di esportazione" viene rimossa (con export -n
in bash
), quindi di solito non è necessario riesportarla. Disattivare una variabile con la unset
elimina (non importa se si tratta di una variabile di ambiente o meno).
Le matrici e gli hash associativi in bash
e altri shell non possono essere esportati per diventare variabili di ambiente. Le variabili di ambiente devono essere variabili semplici i cui valori sono stringhe e spesso hanno nomi costituiti da lettere maiuscole.
L'uso delle variabili di ambiente è per tenere traccia dei dati nella sessione di shell corrente, ma anche per consentire a qualsiasi processo avviato di prendere parte di tali dati. Il caso tipico di ciò è la PATH
variabile d'ambiente, che può essere impostata nella shell e successivamente utilizzata da qualsiasi programma che desideri avviare programmi senza specificare un percorso completo per essi.
La raccolta di variabili d'ambiente in un processo viene spesso definita "l'ambiente del processo". Ogni processo ha il suo ambiente.
Le variabili di ambiente possono solo essere "inoltrate", ovvero un processo figlio non può mai modificare le variabili di ambiente nel suo processo padre e, oltre all'avvio dell'ambiente per un processo figlio all'avvio, un processo padre non può modificare l'ambiente esistente di un processo figlio.
Le variabili d'ambiente possono essere elencate con env
(senza argomenti). Oltre a ciò, appaiono uguali alle variabili shell non esportate in una sessione shell. Questo è un po 'speciale per la shell poiché la maggior parte degli altri linguaggi di programmazione di solito non mescola variabili "ordinarie" con variabili di ambiente (vedi sotto).
env
può anche essere usato per impostare i valori di una o più variabili d'ambiente nell'ambiente di un processo senza impostarle nella sessione corrente:
env CC=clang CXX=clang++ make
Questo inizia make
con la variabile d'ambiente CC
impostata sul valore clang
e CXX
impostata su clang++
.
Può anche essere utilizzato per cancellare l'ambiente per un processo:
env -i bash
Questo inizia bash
ma non trasferisce l'ambiente corrente per il nuovo bash
processo (sarà ancora avere variabili d'ambiente in quanto crea nuovi dai suoi script di shell di inizializzazione).
Esempio di differenza
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
Altre lingue
Esistono funzioni di libreria nella maggior parte dei linguaggi di programmazione che consentono di ottenere e impostare le variabili di ambiente. Si noti che poiché le variabili di ambiente sono memorizzate come una semplice relazione chiave-valore, di solito non sono "variabili" della lingua. Un programma può recuperare il valore (che è sempre una stringa di caratteri) corrispondente a una chiave (il nome della variabile d'ambiente), ma dovrà quindi convertirlo in un numero intero o qualunque tipo di dati la lingua si aspetti che abbia il valore.
In C, le variabili di ambiente possono essere accessibili tramite getenv()
, setenv()
, putenv()
e unsetenv()
. Le variabili create con queste routine sono ereditate allo stesso modo da qualsiasi processo avviato dal programma C.
Altre lingue possono avere strutture di dati speciali per realizzare la stessa cosa, come l' %ENV
hash in Perl o l' ENVIRON
array associativo nella maggior parte delle implementazioni di awk
.