Originariamente pubblicato in data 08/04/1999
A
C
C
O
M
A
Z
Z
I
Lo shell di unix
Lo shell di unix
Volete saperne di più sugli arcani misteri del sistema operativo Unix? Fate un bel respiro, rimboccatevi le maniche e seguitemi nelle sue vaste profondità
Ciascun sistema operativo va accoppiato ad un ambiente di sviluppo (o, più spesso, più d'uno). Infatti il sistema operativo in se si limita a fornire prestazioni ai programmi che girano sulla macchina, ma perche programmi del genere possano venire sviluppati in primo luogo è necessario che siano disponibili supporti alla programmazione.Un programma non nasce quale Minerva dalla testa di Giove, adulta e guerriera: è necessario progettarlo e svilupparlo a pezzi e bocconi, ciascuno dei quali conterrà certamente nella prima stesura una serie di errori e limitazioni. Il programma nella prima stesura va eseguito più e più volte, per controllarne la velocità ed i punti di fallimento, e poi modificato e nuovamente verificato, sinchè non si comporta come desiderato.
Così, per creare un programma è necessario qualcosa di più dell'accoppiata sistema operativo e linguaggio. (Qui per "linguaggio" intendiamo il compilatore o l'interprete o l'assemblatore, cioé quel programma che traduce il codice sorgente scritto dal programmatore in forma eseguibile dal processore della macchina).
Quello che ci manca viene chiamato solitamente "ambiente di sviluppo", se il suo scopo principale è fornire aiuti alla programmazione, o "ambiente di lavoro", se viene al contrario utilizzato dai non-programmatori per colloquiare con il sistema e per selezionare il programma desiderato. Fra i due "environment", come li chiamano gli americani, passa qualche differenza, tanto che un computer potrebbe fornire un buon ambiente di lavoro che non si presta facilmente a divenire ambiente di sviluppo.
Lo shell è un ambiente di sviluppo molto simile esteriormente all'ambiente Basic, che molti lettori di Bit certamente conoscono. Anche qui, un prompt attende i comandi dell'utente, ed anche qui è possibile battere comandi di programmazione in modo diretto. Tuttavia, lo shell, creato per grandi sistemi, è più flessibile ed è generalmente più adatto anche per la creazione di programmi nei linguaggi compilati.
L'uso consistente dello shell unito alle altri caratteristiche di cui al capitolo precedente rende Unix un eccellente ambiente di sviluppo e lavoro, anche se le prestazioni del sistema operativo in sé possono venire considerate in scala minore rispetto ad altri sistemi multiutente presenti sul mercato.
Dallo shell possono venire eseguiti programmi scritti in qualunque linguaggio, e battuti comandi in modo diretto che vengono eseguiti dal parser di un semplice linguaggio costruito nello shell (e chiamato appunto il linguaggio di shell). Lo shell permette di passare argomenti ai processi quando li si invoca, direttamente dopo il nome del processo.
Un programma viene eseguito semplicemente battendo il suo nome e seguendolo con gli argomento che si desidera passargli: ad esempio, per eseguire il programma "pippo" con argomenti "pluto" e "paperino" basta scrivere:
pippo pluto paperino Lo shell provvede a copiare il programma in memoria ed avviarlo (avvia un processo: per dettagli, capitolo terzo). Provvede inoltre a mettere gli argomenti in un punto dell'area in memoria accedibile dal processo ed a comunicargli ove si trovano ed in che numero.
E' possibile ottenere dallo shell una versione più sofisticata dei file exec, che viene chiamata nel gergo Unix "script": si tratta anche qui di una serie di comandi, che siano di linguaggio di shell o invocanti processi. E' possibile in questo caso che i processi invocati restituiscano allo shell dei valori che indicano il successo od il fallimento del loro compito, di modo che il programma script testando i valori possa regolarsi di conseguenza.
E' anche possibile passare argomenti agli script, rendendoli così super-programmi a tutti gli effetti.
Non esiste un comando specifico per avviare un processo: quando l'utente batte una riga di input per lo shell, lo shell provvede dapprima a verificare se si tratta di un comando proprio (consultando una tabella dei comandi "built-in"), poi se non è questo il caso consulta la directory dell'utente e cerca un programma eseguibile che abbia il nome indicato. Se questo è il caso esegue il processo.
Questo significa che lo shell è eccezionalmente flessibile, e che per aggiungervi un comando è sufficiente scrivere nel linguaggio preferito il programma che esegue il comando e salvarlo nella propria directory. Il meccanismo rende leggermente più lenta l'esecuzione di un comando (poichè tutte le volte la directory viene scorsa, provocando un accesso al disco che ha tempi relativamengte lunghi). D'altra parte un uso intelligente delle risorse da parte dello shell, grazie al prefetching ed alla cache memory (termini che non spiegheremo qui), minimizza il guaio.
Lo shell di Bourne mette a disposizione dell'utente numerose 'facilities', utilità di vario genere, che vengono combinate facilmente per produrre strumenti sofisticati e specifici con il meccanismo della ridirezione.
Ad esempio, poniamo di voler vedere sullo schermo il contenuto del file chiamato "lettera" e del file "seguito". Il comando CAT (che sta per "catenate") dello shell collega tra di loro i file argomento, ed è quindi sufficiente scrivere:
cat lettera seguito Se poi fosse necessaria una stampa del ricavato, sapendo che la stampante va sotto il nome convenzionale di LPR (per "line printer"), sarà sufficiente RIDIRIGERE l'output del comando CAT sulla stampante, con
cat lettera seguito | lpr E' possibile combinare i comandi, usando i "filtri" (processi che ricevono un argomento in input e ne restituiscono un altro in output sfruttando la ridirezione).
Nella tabella uno abbiamo elencato una serie non esaustiva dei filtri disponibili con lo shell di Bourne. A questi va aggiunto Awk, un filtro programmabile che analizza il testo in input alla ricerca di termini specificategli ed esegue azioni programmate se trova uno di essi.
Nome Signif. Input OutputCosicchè, per trovare il numero di errori di battutura nella lettera basterà chiedere allo shell di eseguire: cat lettera | spell | wc Un ulteriore capacità dello shell è di elaborare la storia di una sessione di lavoro. Lo shell "ricorda" i comandi battuti ed è in grado di rieseguire un comando del quale sia specificato l'ordine, a partire dal primo o dell'ultimo eseguito, se necessario editandolo e modificandone qualche parametro. Il metodo impiegato per la "history substitution" è in verità piuttosto macchinoso, ma consente sofisticazioni notevolissime agli utenti esperti che se ne siano impadroniti.
cat catenate Più file qualunque Un solo file contenente i dati
cb C beautifier Un programma in linguaggio C Il programma indentato
cmp compare Due file Differenze tra i file
comm common Due file Ordina lessicograficamente
crypt Un file e una password Codifica e decritta i file
dd Un file Converte set di caratteri etc
echo Un file Lo stesso file
expr expression Espressioni matematiche I loro risultati
grep Un file ed un termine Righe ove appare il termine
join database join Due o più basi di dati Esegue il join
learn Un comando di shell Spiegazioni sul comando
lint C verifier Un programma in linguaggio C Diagnosi, commenti, bugs
look Un file ed un termine Righe inizianti per il termine
od octal dump Un file Codici dei caratteri nel file
pubindex Referenze bibliografiche Una bibliografia
sort sorting Uno o più file Il file ordinato
spell Un file e un vocabolario Trova errori di battitura
tail Un file e una posizione Il file da "posizione" in poi
tr translation Un file e coppie di caratteri Cambia i "1° car" in "2° car"
uniq unique Un file Le linee ripetute
wc word count Un file Il numero di parole nel file
Lo shell di Bourne, infine, consente l'uso dei vari toolkit ed utilità varie di Unix, tra i quali editori per programma e per testi (word processor), debuggers, linker, compilatori, data base management system e quanti altri l'utilizzatore abbia installato nel sistema.
Per concludere, lo shell rappresenta un ambiente ideale di sviluppo ed un efficiente ambiente di lavoro, sacrificando l'immediatezza a favore della potenza e della flessibilità degli strumenti forniti. E' perfettamente adattabile all'utente che possieda esperienza di programmazione.