# Variabile d'ambiente (Unix)

Le variabili d'ambiente, nei sistemi operativi Unix e Unix-like, e più in generale nei sistemi POSIX sono un tipo di variabili specifiche per processo.

## Descrizione

Ogni processo possiede il proprio insieme di variabili d'ambiente distinto e separato da quello degli altri processi, ed in nessun caso un processo può modificare le variabili d'ambiente di un altro processo; esse tuttavia si propagano, duplicandosi, di processo padre in processo figlio.
Le variabili d'ambiente hanno un ruolo tradizionalmente significativo nella configurazione dei programmi: esse sono usate ad esempio per specificare le impostazioni di localizzazione, o per indicare ad un programma le directory ove reperire le proprie risorse, o ancora per modificarne il comportamento predefinito. Il fatto che siano di pratico utilizzo nella programmazione, unito al fatto che i meccanismi di gestione ed i vincoli siano rimasti sostanzialmente immutati per decenni, fa sì che esse siano ancora alquanto popolari negli ambienti Unix.
Le variabili d'ambiente sono tipicamente definite e avvalorate negli script di shell che sono eseguiti all'avvio del sistema, in quelli eseguiti al login di un utente (ad esempio /etc/profile o su alcuni sistemi anche /etc/environment) ed in quelli eseguiti ad ogni avvio di una shell testuale (ad esempio ~/.bashrc per Bash).

### Caratteristiche

* sono accessibili attraverso un'apposita API fornita dal sistema operativo;
* a differenza delle altre variabili, esse non sono cancellate quando un processo sovrappone a se stesso un nuovo programma tramite una delle chiamate di sistema della famiglia exec;
* un processo figlio, in fase di avvio, eredita una copia delle variabili d'ambiente dal proprio processo padre. Essendo una copia, le modifiche effettuate dal processo figlio non sono visibili al processo padre, né le modifiche che il processo padre effettuerà in seguito saranno visibili ai processi figli preesistenti.

### Vincoli su nomi e valori

Le variabili d'ambiente sono implementate come un array di stringhe secondo le convenzioni del linguaggio C, nella forma "nome=valore": questo implica sia che i nomi non possano contenere il carattere "=", sia che né il nome né il valore possano contenere il carattere ASCII 0x00, NUL. Due nomi sono considerati uguali solo se contengono esattamente gli stessi caratteri, per cui viene ad esempio fatta distinzione tra lettere maiuscole e minuscole.
A parte questi vincoli, la scelta di nomi per variabili d'ambiente è anche fortemente influenzata dai vincoli di sintassi delle shell testuali, che di fatto restringono la scelta a nomi composti da una lettera o un trattino basso ("_") seguiti da zero o più lettere, cifre e trattini bassi, ad esempio "A", "_Alice_12", "file_temporaneo". Possono esistere variabili che non seguono queste convenzioni nei nomi, tuttavia ciò ne rende alquanto difficile l'utilizzo pratico.
Non vi sono limiti sulle dimensioni massime ed il numero delle variabili d'ambiente, se non quelli dettati dalla disponibilità di memoria; tuttavia le chiamate di sistema della famiglia exec, che sostituiscono il processo invocante con un altro programma, possono fallire se lo spazio totale occupato delle variabili d'ambiente di un processo, unitamente allo spazio occupato dei parametri per il nuovo programma, supera la dimensione in byte definita della costante ARG_MAX definita nello header file limits.h. Il valore minimo di tale costante per lo standard POSIX è di 4096 byte, definito dalla costante _POSIX_ARG_MAX.

### Utilizzo nelle shell testuali

Nelle shell testuali è possibile usare il comando env sia per visualizzare le impostazioni correnti, sia per avviare nuovi programmi con valori particolari delle variabili d'ambiente.
In aggiunta a questo, per le shell derivate dalla Bourne shell come Bash o la Korn shell, il meccanismo delle variabili della shell si sovrappone in parte a quello delle variabili d'ambiente, per cui le variabili d'ambiente sono automaticamente anche variabili della shell, e le variabili della shell possono a loro volta divenire variabili d'ambiente (ad esempio tramite il comando "export nome_variabile"). Ad esempio:

## Variabili d'ambiente di rilievo
### DISPLAY

Questa variabile indica ai programmi dell'X Window System (i programmi con interfaccia grafica in generale) qual è l'X server da usare per visualizzare la propria interfaccia grafica. I valori sono del tipo
* host è facoltativo, ed indica il nome o l'indirizzo IP del computer su cui visualizzare l'interfaccia grafica; se non specificato, assume si tratti del computer locale;
* numero_display è un numero che indica la postazione utente (intesa come combinazione di mouse, tastiera e uno o più monitor) sul computer indicato;
* numero_screen è un numero facoltativo che indica un monitor in particolare della postazione utente (in caso di più monitor).
Il valore tipico è ":0". Altri valori d'esempio possono essere "192.168.1.1:0" e "falcon.localdomain:1.1".

### EDITOR e VISUAL

Queste variabili suggeriscono il comando da usare per avviare un editor di testo per modificare un file di testo.
Valori tipici possono essere "vi", "emacsclient" o anche "gedit" (quest'ultimo in ambito GNOME).

### ENV

Questa variabile indica il nome di uno script di shell da eseguire ad ogni avvio in modalità interattiva della shell, in aggiunta ad altri script eseguiti automaticamente all'avvio in seguito alla procedura di login.
Valori tipici possono essere ad esempio "~/.bashrc" o "~/.kshrc".

### HOME

Normalmente viene avvalorata automaticamente dal sistema con il pathname della home directory dell'utente corrente.

### http_proxy e ftp_proxy

Queste variabili indicano quale proxy usare per connessioni HTTP e FTP. Ad esempio, in uno script di shell:

### LANG

Questa variabile specifica le impostazioni locali, come lingua da usare per l'interfaccia utente, convenzioni su formato di data e ora, rappresentazione dei numeri, codifica dei carattere in uso e altro ancora. Viene usata per specificare le impostazioni predefinite di sistema.
I valori possibili per LANG sono quelli elencati dal comando "locale -a", ad esempio "it_IT.UTF-8", o "C".
LANG è solo una delle variabili d'ambiente che controllano la localizzazione: ne esistono altre che trattano aspetti specifici (ad esempio LC_MONETARY, LC_MESSAGES, LC_NUMERIC) ed hanno precedenza su LANG. In particolare esiste anche LC_ALL che ha precedenza su tutte le altre (anche su LANG) e che può essere usata per specificare rapidamente l'uso di una localizzazione diversa da quella predefinita.

### LD_LIBRARY_PATH

Nei sistemi che adottano ELF come formato dei file eseguibili, indica al linker dinamico una serie di directory separate da due punti (":") in cui cercare librerie software in aggiunta a quelle predefinite nel sistema.

### LD_PRELOAD

Nei sistemi che adottano ELF come formato dei file eseguibili, indica al linker dinamico una o più librerie software da precaricare, in aggiunta a quelle richieste dal programma.
Questo meccanismo è utile per usare librerie che ridefiniscono l'implementazione di funzioni standard, e che ad esempio possono permettere di accedere in maniera trasparente a file compressi o tenere traccia di tutte le allocazioni di memoria effettuate.

### MANPATH

Specifica una serie di directory separate da due punti (":") in cui cercare delle pagine man, in aggiunta a quelle predefinite nel sistema.

### PATH

Specifica una serie di directory separate da due punti (":") in cui il sistema ricerca file eseguibili quando essi non sono qualificati con alcuna directory.
Un valore tipico è "/bin:/usr/bin:/usr/local/bin", ma varia da sistema a sistema.
È da sottolineare che per motivi di sicurezza, nei sistemi Unix e Unix-like la directory corrente (rappresentata con un punto ".") non viene automaticamente inclusa tra quelle in cui effettuare la ricerca: se si vuole includerla, occorre specificarla esplicitamente nel valore di PATH.

### POSIXLY_CORRECT

Se è definita (il valore non è rilevante), i programmi del progetto GNU si comportano secondo quanto previsto dallo standard POSIX anche nei casi dove normalmente essi divergono dallo standard.
Ad esempio, lo standard POSIX prevede che i comandi df e du utilizzino come unità di misura dei blocchi da 512 byte, mentre le versioni GNU normalmente utilizzano come unità di misura dei blocchi da un KiB. Impostando la variabile d'ambiente POSIXLY_CORRECT ad un qualunque valore anch'essi useranno blocchi da 512 byte.

### TMPDIR

Specifica il pathname di una directory da usare per file temporanei.
Normalmente non è impostata, in quanto le directory per i file temporanei sono già stabilite per convenzione (ovvero /tmp e /var/tmp), tuttavia è buona norma per i programmi che creano file temporanei di grosse dimensioni prendere in considerazione anche il valore di questa variabile prima di usare direttamente le directory standard.

### TERM

Indica il tipo di terminale o terminale virtuale in uso, in modo che i programmi che offrono un'interfaccia a caratteri possano visualizzarla correttamente. Il valore è un identificativo in una base dati fornita dal sistema operativo (termcap o terminfo) che descrive le caratteristiche del terminale e le sequenze di caratteri necessarie a compiere azioni quali ad esempio lo spostamento del cursore o la cancellazione di una linea.
Valori tipici sono "xterm" e "vt100"

### TZ

Specifica la regola da usare per convertire dalla data di sistema (mantenuta internamente in tempo coordinato universale) nella data e ora locali all'utente, e viceversa.