Nelle scorse puntate abbiamo visto quali sono i comandi di shell più utili per gestire gli applicativi di una macchina Linux, come ad esempio un server remoto in hosting. Tra gli argomenti più importanti, per quanto riguarda il deploy di applicazioni in remoto, abbiamo discusso la definizione delle variabili d’ambiente all’interno della shell bash.

L’argomento è cruciale soprattutto se abbiamo dubbi riguardo la configurazione runtime di una macchina Linux. Una situazione tipica, quando si passa da un ambiente di sviluppo a quello di test, o da test a produzione, è che qualcosa “si rompa” nel passaggio. Il software è lo stesso, le librerie sono le stesse, eppure l’applicazione non gira (o non gira come dovrebbe). In molti casi il problema riguarda le variabili d’ambiente, che in generale sono diverse da una macchina all’altra. Una volta imparato a definire le variabili d’ambiente, e renderle disponibili a tutte le shell tramite il comando export, abbiamo risolto il problema solo in parte. Quello che ci manca è la conoscenza del meccanismo che permette di rendere permanenti tali variabili, in modo da averle sempre definite nella shell, senza il bisogno di specificarle a mano ogni volta.

Il problema si risolve mettendo le mani ai files di configurazione del profilo della shell. Ne esistono diversi, e i nomi possono cambiare a seconda della distribuzione Linux, ma in linea di massima i concetti sono gli stessi. Con un po’ di elasticità dovrebbe sempre essere possibile identificare il file che ci serve, e diventerà più facile con l’esperienza. Pensiamo ai files di configurazione come ai condimenti da tavola: sale, pepe, olio, aceto. Ogni ristorante avrà le sue etichette e le sue confezioni (i nomi dei files), ma dopo averli assaggiati almeno una volta (letto il contenuto) dovrebbe diventare facile distinguerli in base alla loro funzione, senza farci confondere dal nome o dall’etichetta. Vediamo subito un esempio pratico, considerando i files di configurazione globali, cioè quelli che definiscono l’ambiente di lavoro comune a tutti gli utenti. Questi files potrebbero essere

/etc/profile

/etc/bashrc

oppure

/etc/profile

/etc/bash.bashrc

ma, a parte i diversi nomi, la loro funzione è sempre quella: gestire l’avvio generico di una shell ed impostare le variabili d’ambiente comuni a tutti gli utenti. Nel nostro caso non ci interessa mettere mano a questi files, perché dovrebbe essere compito dell’amministratore della macchina, ma è bene sapere della loro esistenza. Quello che ci interessa è invece la nostra configurazione personale, ovvero quella caricata nella shell al momento del login con la nostra utenza specifica.

Profilo utente

I files di configurazione personale, che riguardano solamente l’ambiente di un utente specifico (eventualmente sovrascrivendo quelli locali), sono dei files nascosti all’interno della directory home dell’utente. Anche qui i nomi potrebbero cambiare leggermente a seconda della distribuzione e della shell. Rimanendo nell’ambito della shell bash questi files dovrebbero essere

.bash_profile .bashrc .bash_logout

Quelli che servono al nostro scopo, ovvero permetteno di definire delle variabili d’ambiente in modo permanente, sono il .bash_profile o il .bashrc: probabilmente basterà modificare uno dei due, a seconda della situazione, come vedremo tra poco. Il bash_logout non ci interessa in questa sede, perché contiene le istruzioni da eseguire quando abbandoniamo la shell (logout).

Qual è la differenza tra il .bash_profile e il .bashrc? Di solito il .bash_profile viene eseguito quando ci colleghiamo alla macchina, effettuando il login tramite username e password. Di contro il .bashrc viene eseguito ogni volta che apriamo un nuovo terminale. Per questo motivo, a seconda del contesto, uno dei due files potrebbe non essere presente. Se usiamo Ubuntu, ad esempio, probabilmente non avremo il file .bash_profile, perché accediamo al terminale direttamente dall’ambiente grafico, senza effettuare alcun login, per cui ci basta il .bashrc.

Una volta identificato qual è il file che ci interessa, possiamo definire le variabili d’ambiente al suo interno, preferibilmente alla fine del file (per questioni di ordine e pulizia). Consideriamo ad esempio un ambiente di lavoro su Ubuntu, dove abbiamo a disposizione il file .bashrc. Supponiamo di aver bisogno di una variabile permanente di nome MY_HOME, che deve puntare alla directorty /usr/my_app. In tal caso editiamo il file .bashrc e inseriamo alla fine le seguenti righe

export MY_HOME=/usr/my_app export PATH=$PATH:$MY_HOME

le righe qui sopra svolgono due funzioni ben distinte. L'assegnazione export MY_HOME=/usr/my_app definisce ed esporta la variabile MY_HOME, che in questo modo sarà disponibile a tutti i terminali aperti con la nostra utenza. Se seconda riga fa qualcosa in più del richiesto, ovvero appende alla variabile PATH il valore della variabile MY_HOME. Questo non è sempre necessario, ma serve solamente se vogliamo eseguire i comandi (o script) presenti all'interno della directory /usr/my_app da qualsiasi altro percorso, esattamente come nel caso della variabile PATH su Windows.

Un'ultima avvertenza. Se eseguiamo le modifiche via terminale, e salviamo il nuovo profilo, non stupiamoci se il sistema operativo sembrerà ignorare le nuove variabili. Come detto sopra, il file .bashrc viene caricato al momento di apertura di un nuovo terminale. Se stiamo lavorando in una shell già aperta, è corretto che le modifiche al file .bashrc non vengano applicate immediatamente, ma solamente nelle shell che apriremo da quel momento in poi. Il modo più semplice di verificarlo è chiudere la shell corrente e riaprirla, per trovare tutte le variabili che abbiamo definito.