Corso Linux Base – Lezione 2
Tutte le shell gestiscono un insieme di informazioni. Queste informazioni di runtime possono cambiare durante la sessione e influenzano il comportamento della shell. Questi dati vengono anche utilizzati dai programmi per determinare aspetti della configurazione del sistema. La maggior parte di questi dati è archiviata nelle cosiddette variabili, che tratteremo in questa lezione.
Variabili
Le variabili sono parti di memoria utilizzate per contenere dati, come testo o numeri. Una volta impostato, è possibile accedere al valore di una variabile in un secondo momento. Le variabili hanno un nome che consente di accedere a una specifica variabile, anche quando il contenuto della variabile cambia. Sono uno strumento molto comune nella maggior parte dei linguaggi di programmazione. Nella maggior parte delle shell Linux, esistono due tipi di variabili:
- Variabili locali (local variables): queste variabili sono disponibili solo per il processo di shell corrente. Se si crea una variabile locale e quindi si avvia un altro programma da questa shell, la variabile non è più accessibile a quel programma. Poiché non sono ereditati da processi secondari, queste variabili sono chiamate variabili locali.
- Variabili d’ambiente (environment variables): queste variabili sono disponibili sia in una sessione di shell specifica che in sottoprocessi generati da quella sessione di shell. Queste variabili possono essere utilizzate per trasmettere i dati di configurazione ai comandi eseguiti. Poiché i programmi possono accedere a queste variabili, vengono chiamati variabili di ambiente. La maggior parte delle variabili di ambiente sono in maiuscolo (ad es. PATH, DATE, USER). Una serie di variabili d’ambiente predefinite fornisce, ad esempio, informazioni sulla home directory o sul tipo di terminale dell’utente. A volte il set completo di tutte le variabili di ambiente viene definito ambiente (environment).
Le variabili non sono persistenti. Quando la shell in cui sono stati impostati viene chiusa, tutte le variabili e il loro contenuto vengono persi. La maggior parte delle shell fornisce file di configurazione che contengono variabili che vengono impostate ogni volta che viene avviata una nuova shell. Le variabili che devono essere impostate in modo permanente devono essere aggiunte a uno di questi file di configurazione.
Lavorare con le variabili locali
È possibile impostare una variabile locale utilizzando l’operatore = (uguale). Una semplice assegnazione creerà una variabile locale:
$ greeting=hello
Non mettere spazi prima o dopo l’operatore =.
Puoi visualizzare qualsiasi variabile usando il comando echo. Il comando di solito visualizza il testo dell’argomento:
$ echo greeting greeting
Per accedere al valore della variabile dovrai utilizzare $ (simbolo del dollaro) davanti al nome della variabile.
$ echo $greeting
hello
Se provi ad aprire un’altra shell e eseguire nuovamente il comando
$ echo $greeting
In questo caso non viene visualizzato nulla. Questo dimostra che le variabili esistono sempre solo in una shell specifica. Per verificare che la variabile sia effettivamente una variabile locale, provare a generare un nuovo processo e verificare se questo processo può accedere alla variabile. Possiamo farlo avviando un’altra shell e lasciare che questa shell esegua il comando echo. Poiché la nuova shell viene eseguita in un nuovo processo, non erediterà le variabili locali dal suo processo padre:
$ echo $greeting world
hello world
$ bash -c 'echo $greeting world'
world
Assicurati di usare le virgolette singole nell’esempio sopra.
Per rimuovere una variabile, dovrai usare il comando unset:
$ echo $greeting
hey
$ unset greeting
$ echo $greeting
unset richiede il nome della variabile come argomento. Pertanto non è possibile aggiungere $ al nome, facendo ciò verrebbe passato il valore della variabile al comando unset anziché il nome della variabile.
Lavorare con le variabili globali
Per rendere una variabile disponibile per i sottoprocessi della shell, bisogna trasformarla da variabile locale a variabile d’ambiente. Questo viene fatto dal comando export. Quando viene invocato con il nome della variabile, questa variabile viene aggiunta all’ambiente della shell:
$ greeting=hello
$ export greeting
Ancora una volta, assicurati di non usare $ quando esegui export perché in questo caso è necessario passare il nome della variabile e non il suo contenuto.
Un modo più veloce per creare la variabile d’ambiente consiste nel combinare entrambi i metodi sopra, come si può vedere dall’esempio successivo
$ export greeting=hey
Controlliamo nuovamente se adesso la variabile è accessibile ai sottoprocessi della shell:
$ export greeting=hey
$ echo $greeting world
hey world
$ bash -c 'echo $greeting world'
hey world
Un altro modo di usare le variabili di ambiente è usarle davanti ai comandi. Possiamo testarlo con la variabile d’ambiente TZ che contiene il fuso orario. Questa variabile viene utilizzata dal comando date per determinare quale ora del fuso orario visualizzare:
$ TZ=EST date
Thu 31 Jan 10:07:35 EST 2019
$ TZ=GMT date
Thu 31 Jan 15:07:35 GMT 2019
È possibile visualizzare tutte le variabili di ambiente utilizzando il comando env
La variabile PATH
La variabile PATH è una delle variabili d’ambiente più importanti in un sistema Linux. Memorizza un elenco di directory, separate da due punti, che contengono programmi ed eseguibili che possono essere utilizzati come comandi dalla shell Linux.
$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Per aggiungere una nuova directory alla variabile, dovrai usare il segno due punti (:).
$ PATH=$PATH:new_directory
Ad esempio
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ PATH=$PATH:/home/user/bin
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin
Come vedi dopo la nuova assegnazione, $ PATH contiene il nuovo valore. Durante l’assegnazione per preservare il valore originale si utilizza $PATH al quale viene aggiunto in fondo il carattere dei due punti (:) e la nuova directory che si vuole aggiungere all’elenco dei percorsi contenente i comandi. Naturalmente, puoi anche usare altre variabili durante l’assegnazione:
$ mybin=/opt/bin
$ PATH=$PATH:$mybin
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin:/opt/bin
La variabile PATH deve essere gestita con cautela, poiché è fondamentale per lavorare sulla riga di comando. Consideriamo la seguente variabile PATH:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Per scoprire come la shell invoca un comando specifico, possiamo eseguire which con il nome del comando come argomento. Ad esempio, proviamo a scoprire dove è memorizzato nano:
$ which nano
/usr/bin/nano
Come si può vedere, l’eseguibile nano si trova nella directory /usr/bin. Rimuoviamo la directory dalla variabile PATH e controlliamo se il comando funziona ancora:
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games
$ which nano
which: no nano in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games)
Come si può vedere, il comando non viene trovato, e di conseguenza non viene eseguito. Il messaggio di errore spiega anche il motivo per cui il comando non è stato trovato e in quali posizioni è stato cercato.
Aggiungiamo nuovamente la directory /usr/bin (che contiene l’eseguibile nano) e proviamo a eseguire nuovamente il comando
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ which nano
/usr/bin/nano
Ora il nostro comando funziona regolarmente.
L’ordine degli elementi in PATH definisce anche l’ordine di ricerca. Il primo percorso nel quale viene cercato il comando nano nell’esempio è /usr/local/sbin