Tutti i processi Unix contengono un "ambiente". Questo è una lista di variabili che contengono nome e rispettivo valore, entrambi sotto forma di stringhe che possono contenere la maggior parte dei caratteri. Ogni processo Unix ha un processo padre che lo ha creato. Un processo figlio eredita l'ambiente dal processo padre ed esso stesso può fare delle modifiche al proprio ambiente per poi passare a sua volta tale ambiente modificato ai figli.
Una variabile d'ambiente importante è PATH, una lista di directory separate da caratteri due punti (':'). Il sistema cerca in queste directory per trovare i comandi da eseguire. Se si prova ad invocare il comando "foo", il sistema cerca un file eseguibile (con permessi di esecuzione) di nome "foo" in tutte le directory che trova in PATH, nell'ordine in cui vi sono scritte. Se un file del genere è trovato esso viene eseguito.
In questo howto uso il termine "comando" riferendomi ad un programma eseguibile che si intende invocare attraverso questo meccanismo (senza fornire il percorso completo).
In Linux anche le chiamate di sistema di basso livello che servono ad avviare i processi (la famiglia di chiamate exec) cercano gli eseguibili nelle directory indicate nella variabile PATH: si può usare il meccanismo di path ovunque ogni volta che si prova ad eseguire un comando. Se una chiamata di sistema "exec" ha per argomento un nome di file che non contiene il carattere '/' il sistema prova ad usare la variabile d'ambiente PATH. Se nell'ambiente non è presente tale variabile l'eseguibile viene cercato (almeno) nelle directory /bin e /usr/bin.
In sh viene utilizzato il comando "export" per impostare una variabile d'ambiente, in csh il comando equivalente è "setenv". Ad esempio:
sh:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.
csh:
setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.
I programmi C possono usare la funzione di libreria setenv() per modificare l'ambiente. In Perl l'ambiente è contenuto nell'array associativo %ENV , PATH può essere impostata semplicemente ad esempio così $ENV{PATH}="/bin".
Il comando "env" è il modo più semplice di visualizzare le variabili d'ambiente correnti. Esso può essere usato anche per modificarle.
Ulteriori informazioni sul meccanismo dell'ambiente sono contenute nelle pagine del manuale "environ", "execl", "setenv", nel file info "env" e nella documentazione delle shell.
All'avvio di Linux, il primo processo normale che viene avviato è init. È un processo particolare, perché non ha un padre, ma tutti gli altri processi derivano da esso. L'ambiente di init è quello che tutti i processi avrebbero se non modificassero il proprio ambiente, ma la maggior parte fa qualche cambiamento.
Init fa partire un gruppo di processi. Il file /etc/inittab dice al sistema quali processi eseguire. Questi processi girano in un ambiente direttamente ereditato da init, tipicamente sono processi come "getty", il programma che scrive "login:" sulla console. Se si fa partire una connessione PPP a questo punto, bisogna ricordare che si sta lavorando nell'ambiente di init. L'inizializzazione del sistema è spesso uno script fatto partire in questa fase. In Debian 1.3 lo script di inizializzazione è /etc/init.d/rc e chiama altri script a sua volta.
Il sistema contiene molti server (demoni) che possono o non possono utilizzare l'ambiente predefinito. La maggior parte dei server sono fatti partire dagli script di inizializzazione e quindi hanno l'ambiente di init.
Nel momento in cui l'utente accede al sistema, l'ambiente è influenzato dalle impostazioni compilate nei programmi, dagli script di inizializzazione del sistema e dagli script di inizializzazione specifici dell'utente. È un meccanismo abbastanza complicato e la situazione corrente non è del tutto soddisfacente. Per l'utente cambia tutto tra il fare il login da console testuale, da XDM o da rete.