Variabili d'ambiente
Ultimo aggiornamento il 2025-08-04 | Modifica questa pagina
Panoramica
Domande
- Come si impostano e si accede alle variabili nella shell Unix?
- Come si possono usare le variabili per cambiare l’esecuzione di un programma?
Obiettivi
- Capire come vengono implementate le variabili nella shell
- leggere il valore di una variabile esistente
- Creare nuove variabili e cambiarne i valori
- Modificare il comportamento di un programma utilizzando una variabile d’ambiente
- Spiegare come la shell utilizza la variabile
PATH
per cercare gli eseguibili
Provenienza dell’episodio
Questo episodio è stato remixato dall’episodio Shell Extras sulle variabili di shell e dall’episodio HPC Shell sugli script.
La shell è solo un programma e, come gli altri programmi, ha delle variabili. Queste variabili controllano la sua esecuzione, quindi cambiando i loro valori si può cambiare il comportamento della shell (e, con un po’ più di sforzo, il comportamento degli altri programmi).
Le variabili sono un ottimo modo per salvare informazioni con un nome a cui si può accedere in seguito. Nei linguaggi di programmazione come Python e R, le variabili possono memorizzare praticamente tutto ciò che si può pensare. Nella shell, di solito, memorizzano solo testo. Il modo migliore per capire come funzionano è vederle in azione.
Cominciamo con l’eseguire il comando set
e osserviamo
alcune delle variabili in una tipica sessione di shell:
OUTPUT
COMPUTERNAME=TURING
HOME=/home/vlad
HOSTNAME=TURING
HOSTTYPE=i686
NUMBER_OF_PROCESSORS=4
PATH=/Users/vlad/bin:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
PWD=/home/vlad
UID=1000
USERNAME=vlad
...
Come si può vedere, ce ne sono parecchie, anzi quattro o cinque volte
di più di quelle mostrate qui. E sì, l’uso di set
per
mostrare le cose può sembrare un po’ strano, anche per Unix, ma
se non gli si dà alcun argomento, può anche mostrare cose che si possono
impostare.
Ogni variabile ha un nome. Tutti i valori delle variabili di shell
sono stringhe, anche quelle (come UID
) che sembrano numeri.
Spetta ai programmi convertire queste stringhe in altri tipi, se
necessario. Per esempio, se un programma volesse sapere quanti
processori ha il computer, convertirebbe il valore della variabile
NUMBER_OF_PROCESSORS
da una stringa a un numero intero.
Mostrare il valore di una variabile
Mostriamo il valore della variabile HOME
:
OUTPUT
HOME
Questo stampa solo “HOME”, che non è quello che volevamo (anche se è quello che abbiamo effettivamente chiesto). Proviamo invece questo:
OUTPUT
/home/vlad
il segno del dollaro indica alla shell che vogliamo il
valore della variabile piuttosto che il suo nome. Questo
funziona proprio come i caratteri jolly: la shell effettua la
sostituzione prima di eseguire il programma richiesto. Grazie a
questa espansione, ciò che viene eseguito è
echo /home/vlad
, che mostra la cosa giusta.
Creazione e modifica di variabili
Creare una variabile è facile: basta assegnare un valore a un nome
usando “=” (bisogna solo ricordare che la sintassi richiede che non ci
siano spazi intorno a =
):
OUTPUT
Dracula
Per cambiare il valore, basta assegnarne uno nuovo:
OUTPUT
Camilla
Variabili d’ambiente
Quando abbiamo eseguito il comando set
abbiamo visto che
c’erano molte variabili i cui nomi erano in maiuscolo. Questo perché,
per convenzione, le variabili che sono disponibili per l’uso da parte di
altri programmi hanno nomi maiuscoli. Tali variabili sono
chiamate variabili d’ambiente in quanto sono variabili di shell
definite per la shell corrente ed ereditate da qualsiasi shell o
processo figlio.
Per creare una variabile d’ambiente è necessario export
una variabile di shell. Ad esempio, per rendere la nostra
SECRET_IDENTITY
disponibile ad altri programmi che
chiamiamo dalla nostra shell, possiamo fare:
È anche possibile creare ed esportare la variabile in un unico passaggio:
Usare le variabili d’ambiente per cambiare il comportamento del programma
Impostare una variabile di shell TIME_STYLE
per avere un
valore di iso
e controllare questo valore con il comando
echo
.
Ora, eseguite il comando ls
con l’opzione
-l
(che dà un formato lungo).
export
la variabile e rieseguire il comando
ls -l
. Notate qualche differenza?
La variabile TIME_STYLE
non viene vista da
ls
fino a quando non viene esportata, a quel punto viene
usata da ls
per decidere quale formato di data usare quando
presenta il timestamp dei file.
È possibile vedere l’insieme completo delle variabili d’ambiente
nella sessione corrente della shell con il comando env
(che
restituisce un sottoinsieme di ciò che ci ha dato il comando
set
). L’insieme completo delle variabili d’ambiente
è chiamato ambiente di esecuzione e può influenzare il
comportamento dei programmi eseguiti.
Variabili d’ambiente di lavoro
Quando Slurm
esegue un lavoro, imposta una serie di
variabili d’ambiente per il lavoro. Una di queste ci permette di
verificare da quale directory è stato inviato lo script del lavoro. La
variabile SLURM_SUBMIT_DIR
è impostata sulla directory da
cui è stato inviato il lavoro. Utilizzando la variabile
SLURM_SUBMIT_DIR
, modificate il vostro lavoro in modo che
stampi la posizione da cui è stato inviato il lavoro.
Per rimuovere una variabile o una variabile d’ambiente si può usare
il comando unset
, ad esempio:
La variabile d’ambiente PATH
Analogamente, alcune variabili d’ambiente (come PATH
)
memorizzano elenchi di valori. In questo caso, la convenzione è di usare
i due punti ‘:’ come separatore. Se un programma vuole i singoli
elementi di un tale elenco, è sua responsabilità dividere il valore
della stringa della variabile in pezzi.
Diamo un’occhiata più da vicino alla variabile PATH
. Il
suo valore definisce il percorso di ricerca degli eseguibili della
shell, cioè l’elenco delle directory in cui la shell cerca i programmi
eseguibili quando si digita il nome di un programma senza specificare la
directory in cui si trova.
Ad esempio, quando si digita un comando come analyze
, la
shell deve decidere se eseguire ./analyze
o
/bin/analyze
. La regola che utilizza è semplice: la shell
controlla ogni directory della variabile PATH
a turno,
cercando un programma con il nome richiesto in quella directory. Non
appena trova una corrispondenza, interrompe la ricerca ed esegue il
programma.
Per mostrare come funziona, ecco i componenti di PATH
elencati uno per riga:
OUTPUT
/Users/vlad/bin
/usr/local/git/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
Sul nostro computer, ci sono in realtà tre programmi chiamati
analyze
in tre diverse directory:
/bin/analyze
, /usr/local/bin/analyze
e
/users/vlad/analyze
. Poiché la shell cerca le directory
nell’ordine in cui sono elencate in PATH
, trova prima
/bin/analyze
e lo esegue. Si noti che non troverà mai il
programma /users/vlad/analyze
a meno che non si digiti il
percorso completo del programma, poiché la directory
/users/vlad
non si trova in PATH
.
Questo significa che posso avere eseguibili in molti posti diversi,
purché mi ricordi che devo aggiornare il mio PATH
in modo
che la mia shell possa trovarli.
Cosa succede se si vogliono eseguire due versioni diverse dello
stesso programma? Dato che condividono lo stesso nome, se le aggiungo
entrambe alla mia PATH
la prima che viene trovata avrà
sempre la meglio. Nel prossimo episodio impareremo a usare strumenti di
aiuto per gestire il nostro ambiente di runtime, in modo da renderlo
possibile senza dover fare un sacco di conti su quale sia o debba essere
il valore di PATH
(e di altre importanti variabili
d’ambiente).
Punti Chiave
- Le variabili di shell sono trattate per impostazione predefinita come stringhe
- Le variabili vengono assegnate utilizzando “
=
” e richiamate utilizzando il nome della variabile preceduto da “$
” - Usare “
export
” per rendere una variabile disponibile ad altri programmi - La variabile
PATH
definisce il percorso di ricerca della shell