Il sistema operativo Unix è un sistema "creato da programmatori per
programmatori", la cui filosofia predominante è quella di
permettere un'elevata configurabilità del sistema, offrendo un
insieme di soluzioni efficienti per velocizzare il processo di
creazione, debugging ed esecuzione dei programmi.
Nella lezione precedente, abbiamo introdotto alcune interessanti
funzionalità disponibili con la shell e non ottenibili con le
più avanzate interfacce grafiche cui gli ultimi sistemi ci hanno
abituato.
Proseguiamo il nostro excursus all'interno dell'interprete dei
comandi, andando ad esaminare ulteriori caratteristiche.
Abbiamo visto come l'esecuzione sequenziale di programmi che necessitano
di comunicare dei dati possa richiedere il ricorso ai file temporanei.
La shell di Unix permettere di evitarne l'utilizzo grazie alle
pipeline, ovvero sequenze di comandi separati dal simbolo
pipe ('|'), per i quali lo standard output del primo comando
è incanalato nello standard input del secondo comando e così via.
Ad es. il comando:
$ sort < sorgente.txt | head -20
è del tutto equivalente alla sequenza di comandi dell'esempio
presentato nella lezione precedente, con la differenza che stavolta
non si è usato alcun file temporaneo, il che rende la riga di
comando più compatta, più leggibile e, perché no, più elegante.
Questo meccanismo consente di creare dei filtri, ovvero
programmi che eseguono delle trasformazioni sui dati ricevuti
dallo standard input e scrivono il risultato sullo standard output.
La filosofia di Unix è quella di fornire, al posto di grossi programmi
dalle molteplici funzioni, dei comandi specializzati in una funzione
particolare, con la conseguenza che ogni programma è estremamente
compatto, efficiente e ben congegnato (più un programma è semplice,
più è possibile ripulirlo dagli errori).
Generalmente filtri anche complessi sono ottenuti dalla composizione
di più comandi in una pipeline più o meno lunga.
E' bene notare che la costruzione di pipeline è possibile perché
tutti i programmi del sistema lavorano con semplici file di testo,
consentendo di interfacciarsi l'uno con l'altro in maniera pressoché
immediata.
Questo risultato non potrebbe essere ottenuto se ogni programma
richiedesse un formato proprietario con cui leggere e scrivere
i dati.
Unix, e quasi tutti i sistemi da esso derivati, è un sistema timesharing
e multiprogrammato, per cui ogni utente è in grado di far girare
più programmi contemporaneamente, ognuno con un processo separato.
Per permettere l'esecuzione contemporanea di più processi, la
shell consente di far girare un programma in background,
ovvero il programma viene eseguito e la shell non attende che
esso termini, ma, subito dopo aver avviato il processo, ripresenta
il prompt in attesa che l'utente digiti il comando successivo.
Per indicare alla shell che il programma (o l'insieme di programmi)
deve girare in background, occorre mettere un carattere '&'
alla fine della riga.
Ad es. il comando:
$ grep return *.c > listareturn.txt &
ricerca all'interno di tutti i file con estensione .c la parola
"return" e scrive il risultato nel file 'listareturn.txt'.
Tutto il processo viene eseguito in background e durante l'esecuzione
la shell rimane disponibile per l'inserimento di altri comandi.
Anche le pipeline possono essere eseguite in background e più
pipeline possono girare in background contemporaneamente.
Infine, un'utilissima funzione messa a disposizione dalla shell
di Unix è quella di poter mettere un elenco di comandi di shell
in un file e di lanciare una shell con quel file come standard
input.
La nuova shell non fa altro che eseguire i comandi nell'ordine
in cui sono scritti, come se fossero stati digitati uno dopo l'altro
dalla tastiera.
I file che contengono comandi shell sono chiamati scripts
e trovano una larghissima applicazione in molti sistemi, ad es.
per l'invocazione di molti servizi all'avvio del sistema.
Gli scripts possono avere anche parametri, usare delle variabili
e utilizzare dei costrutti interni, come if, for,
while e case, cosicché uno script è, a tutti gli
effetti, un programma scritto in un linguaggio comprensibile dalla
shell.
In ambiente Unix esistono diversi interpreti di comandi, ognuno
avente proprie caratteristiche e un proprio linguaggio di programmazione.
Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet