Corso di Sistemi Operativi

Caratteristiche avanzate della Shell - Parte II

 

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