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:

BASH

set

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:

BASH

echo HOME

OUTPUT

HOME

Questo stampa solo “HOME”, che non è quello che volevamo (anche se è quello che abbiamo effettivamente chiesto). Proviamo invece questo:

BASH

echo $HOME

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 =):

BASH

SECRET_IDENTITY=Dracula
echo $SECRET_IDENTITY

OUTPUT

Dracula

Per cambiare il valore, basta assegnarne uno nuovo:

BASH

SECRET_IDENTITY=Camilla
echo $SECRET_IDENTITY

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:

BASH

SECRET_IDENTITY=Camilla
export SECRET_IDENTITY

È anche possibile creare ed esportare la variabile in un unico passaggio:

BASH

export SECRET_IDENTITY=Camilla

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.

BASH

[yourUsername@login1 ~] nano example-job.sh
[yourUsername@login1 ~] cat example-job.sh

OUTPUT

#!/bin/bash
#SBATCH -t 00:00:30

echo -n "This script is running on "
hostname

echo "This job was launched in the following directory:"
echo ${SLURM_SUBMIT_DIR}

Per rimuovere una variabile o una variabile d’ambiente si può usare il comando unset, ad esempio:

BASH

unset SECRET_IDENTITY

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