Informazioni generali

Le variabili d'ambiente sono stringhe con nome disponibili per tutte le applicazioni. Le variabili sono usate per adattare il comportamento di ciascuna applicazione all'ambiente in cui viene eseguita. Si possono definire percorsi per i file, opzioni di lingua e così via. Si può controllare il manuale di ciascuna applicazione per vedere quali variabili vengano usate da essa.

Detto ciò, ci sono diverse variabili standard negli ambienti Linux:

Per vedere le proprie variabili attualmente definite, aprire un terminale e digitare il comando "env".

Le variabili vengono definite con coppie nome-valore: "NOME=stringa qualsiasi come valore". Il nome della variabile solitamente è tutto in lettere maiuscole; tutto ciò che segue il segno di uguaglianza, fino al carattere di fine riga, è considerato come il valore della variabile. Le variabili possono essere definite ad hoc in un terminale scrivendo il comando appropriato. In Bash questo è export MIOVAL="Ciao mondo". In questo caso la variabile rimane definita fino alla fine della sessione di terminale.

Se si desidera aggiungere qualcosa ad una variabile, invece di sovrascrivere il valore precedente, includere il nome della variabile nella nuova definizione. Ad esempio, in Bash usare: "export PATH=$PATH:~/bin". Questo esempio mostra come aggiungere la directory bin all'interno della directory home dell'utente nella variabile d'ambiente PATH.

Nella maggior parte dei casi è molto comodo memorizzare queste variabili in un file di configurazione che viene letto all'avvio del sistema e quando l'utente fa il login, in modo che siano disponibili automaticamente. Sfortunatamente ciò non è sempre così semplice come sembra. Perché? Per un paio di ragioni.

  1. Le variabili d'ambiente vengono ereditate; il programma genitore cioè imposta l'ambiente dei processi figli. È necessario configurare le impostazioni del genitore in modo che vengano passate a tutti i processi figli.
  2. I programmi genitori in questione sono svariate shell e gestori di finestre, ma ciascuno di essi legge un file di configurazione (file punto) diverso quando viene avviato.

Perciò ora è chiaro che deve essere considerato sia l'ordine di avvio dei processi di sistema, sia i file di configurazione che questi leggono all'avvio. Vedere la pagina sui file di configurazione, oppure continuare a leggere questa pagina ...

Ci sono due modi in cui si può usare la propria macchina Linux: dalla console testuale o con un'interfaccia utente grafica.

Usando la console testuale

Il login nella console testuale termina con una shell di login. Le variabili vengono acquisite in vari passaggi, da processi multipli in sequenza. Ogni processo aggiunge alcune variabili in più.

  1. Alla fine dell'avvio viene avviato "init", il genitore di tutti i processi. L'ambiente di init, compresa la variabile PATH, viene definito nel suo codice sorgente e non può essere modificato al momento dell'esecuzione.
  2. init esegue gli script di avvio in /lib/systemd/system (in systemd) o /etc/rc?.d a seconda del runlevel impostato in /etc/inittab (in sysvinit). Ogni servizio o script definisce le proprie variabili di cui ha bisogno.

  3. Alla fine del processo di avvio, init esegue un processo getty su una o più console virtuali. getty resta in attesa aspettando che un utente digiti il proprio nome e successivamente imposta la variabile TERM ed esegue login per chiedere la password.

  4. login controlla in /etc/passwd ed /etc/shadow i dettagli dell'account dell'utente. Se la password può essere accettata, login imposta HOME, SHELL, PATH, LOGNAME e MAIL sulla base del contenuto di /etc/passwd, controlla PAM e da ultimo esegue la shell di login dell'utente.

    1. PAM può dire a login di leggere anche le variabili in /etc/environment. Questo è il comportamento predefinito.

  5. La shell di login viene avviata e legge i suoi file di configurazione specifici.
    1. bash legge prima /etc/profile per ottenere i valori definiti per tutti gli utenti. Dopo aver letto tale file, controlla ~/.bash_profile, ~/.bash_login e ~/.profile, in questo ordine, e legge ed esegue i comandi nel primo di questi file che esiste ed è leggibile. Vedere DotFiles per i dettagli completi.

    2. (informazioni su altre shell sono benvenute)

Ora le variabili d'ambiente sono pronte per essere usate dalle aplicazioni che vengono avviate dal terminale.

Usare un graphical display manager

Il processo di login è piuttosto diverso se si usa un Display manager.

  1. Alla fine dell'avvio di sistema, viene avviato "init", il genitore di tutti i processi.
  2. init esegue i servizi come descritto sopra. Uno di questi servizi è il display manager dell'utente.

  3. Quando l'utente fa il login con successo, il display manager controlla PAM e poi avvia una sessione X.

    1. PAM può dire al display manager di leggere le variabili in /etc/environment.

  4. La sessione X legge ~/.xsessionrc ed eventualmente altri file a seconda del tipo di sessione.

I login grafici in modo predefinito non leggono i file di avvio della shell (/etc/profile e ~/.profile e così via), ma come utente si può scegliere di creare un file ~/.xsessionrc che lo fa.

Guida rapida

Per coloro che hanno fretta e desiderano semplicemente far funzionare le cose, ecco cosa si può fare.

Questo è un approccio veloce e non pulito! Non è per gli utenti iperattenti.

Note ed eccezioni

Startx da terminale

Se si avvia il sistema X Window (la GUI) da una console testuale, le variabili d'ambiente sono già definite dalla shell di login, come spiegato precedentemente. Tuttavia, il gestore di finestre può rileggere gli stessi file un'altra volta (vedere in seguito). Ciò non è solitamente un problema, ma può avere risultati inaspettati come la variabile PATH che ha tutte le voci elencate due volte.

Shell a cascata

Se si avvia un'altra shell da quella di login (sì, è possibile farlo), la seconda è una shell "non di login". Non leggera i file di avvio nominati, ma cercherà invece gli script di avvio "non di login" nella directory home dell'utente. In bash è chiamato ~/.bashrc. Per evitare di specificare gli stessi valori in due posti, solitamente lo script di avvio della shell di login, ~/.bash_profile include ~/.bashrc alla fine della sua esecuzione. Per implementare questo sistema includere le righe seguenti nel proprio file ~/.bash_profile:

if [ -f ~/.bashrc ]; then
   . ~/.bashrc;
fi

Finestra di terminale in X

Se si avvia una finestra di terminale/console nell'ambiente desktop grafico, si tratterà di un terminale non di login e leggerà solo lo script di avvio non di login dell'utente. Per Bash questo è ~/.bashrc.

Usando su

Il comando "su" viene usato per diventare un altro utente durante una sessione di login. È usato comunemente per ottenere temporaneamente i permessi di root da una sessione normale. In Stretch e versioni precedenti, il comando "su" reimposta il valore della variabile d'ambiente PATH a quello definito in /etc/login.defs dalle variabili ENV_PATH e ENV_SUPATH. In Buster, su non cambia la variabile PATH (per i dettagli vedere /usr/share/doc/util-linux/NEWS.Debian.gz).

Notare che l'uso dello strumento Gnome "gksu" dal pannello di Gnome, usa in modo predefinito "su" internamente (cioè il proprio valore di PATH può andare perso se non lo si configura in login.defs, in stretch).


CategorySystemAdministration