La shell Bash è probabilmente il più diffuso interprete di comandi in ambiente UNIX: è disponibile su tutte le piattaforme UNIX in commercio e su tutte le versioni open source del sistema operativo (GNU/Linux, FreeBSD, NetBSD, OpenBSD, ecc.). Bash è stata sviluppata nel 1987 da Brian Fox, come evoluzione della Bourne shell (sh) scritta da Stephen Bourne nel 1978; oggi lo sviluppo e l'implementazione di nuove versioni della shell Bash è curata da Chet Ramey. Di fatto i comandi e le caratteristiche della shell Bash costituiscono un sovra-insieme dei comandi e delle feature della Bourne shell, che è tutt'ora presente, spesso come shell di default, sulla maggior parte dei sistemi operativi UNIX. Bash è un prodotto open source realizzato nell'ambito del progetto GNU. Il nome “Bash” è l'acronimo di “Bourne Again Shell”, proprio per ricordarne la derivazione originaria dalla shell di Stephen Bourne.
Il sito web ufficiale del progetto di manutenzione e sviluppo del programma Bash, a cui è possibile fare riferimento per la documentazione e l'acquisizione del programma stesso (in formato sorgente o binario per diversi sistemi operativi), si trova all'indirizzo http://tiswww.case.edu/php/chet/bash/bashtop.html.
Nelle pagine di questa breve guida vengono presentati alcuni elementi di base per la programmazione della shell Bash. Le shell di comandi presenti in ambiente UNIX infatti sono progettate in modo tale da poter essere utilizzate in modalità interattiva da parte degli utenti, ovvero come interprete di un linguaggio di programmazione per l'esecuzione di un programma vero e proprio.
In questo caso si parla di shell script: in generale si tratta di programmi di piccole dimensioni scritti per automatizzare operazioni ripetitive, utili alla gestione di un server UNIX. In passato si è fatto largo uso degli shell script anche per la realizzazione di applicazioni CGI (common gateway interface) in ambiente web. Oggi l'utilizzo dei linguaggi di scripting di derivazione UNIX per la realizzazione di applicazioni web è circoscritta prevalentemente all'uso del linguaggio Perl che, fra i linguaggi di scripting, è sicuramente uno dei più evoluti.
Nelle pagine seguenti faremo riferimento prevalentemente alla programmazione della Bash su macchine che eseguono un sistema operativo UNIX. Tuttavia è bene precisare che la shell Bash è un programma scritto nel linguaggio di programmazione C, con grande attenzione alla “portabilità” e, pertanto, è stato possibile riprodurne numerose versioni anche per sistemi operativi non UNIX, come Microsoft Windows. In ambiente Windows è disponibile, ad esempio, una versione di Bash nell'ambito del pacchetto denominato Cygwin, che consente di riprodurre un ambiente di esecuzione per numerosissimi programmi nati in ambiente UNIX, attraverso una libreria di compatibilità tra le funzioni di base del sistema operativo UNIX e quelle del sistema operativo Microsoft Windows. Quanto descritto nelle pagine di questa guida può quindi essere sperimentato anche utilizzando una shell Bash in ambiente Windows: in questo caso, per acquisire ed installare quanto necessario per l'esecuzione della shell, si suggerisce di fare riferimento al prodotto Cygwin, disponibile su Internet all'indirizzo http://www.cygwin.com.
Nel seguito di questo manuale assumeremo che siano noti al lettore i comandi UNIX eseguibili attraverso la shell: salvo qualche richiamo specifico per i comandi meno elementari, si rimanda per un approfondimento ai numerosi testi citati tra i riferimenti bibliografici (ad esempio [2] e [5]). Sono invece trattati in dettaglio i comandi interni della shell Bash e le istruzioni per il controllo del flusso dell'algoritmo codificato nello shell script.
Nella presentazione di esempi di comandi della shell in modalità interattiva, viene rappresentato in grassetto il testo inserito in input dall'utente, per distinguerlo dall'output prodotto dalla shell. Nei numerosi listati riportati nelle pagine seguenti, le righe sono numerate per poter fare riferimento nel testo alle istruzioni riportate negli script; inoltre sono evidenziate in grassetto le “parole chiave” che costituiscono i comandi del linguaggio Bash e in corsivo i commenti presenti nello script.
Descrivendo un linguaggio “artificiale” come quello della Bash, con un approccio elementare ed introduttivo come quello adottato in questo breve manuale, si cammina su un crinale sdrucciolevole: da un lato si cerca di fare in modo di mantenere breve e conciso il discorso, in modo da non annoiare chi legge, d'altra parte però così si corre il rischio di tralasciare aspetti rilevanti e che possono impedire una comprensione dell'argomento a lettori meno esperti e dunque privi di quegli strumenti che altrimenti consentirebbero di fare a meno di molti dettagli. Spero quindi di aver trovato il giusto equilibrio fra sintesi ed efficacia del testo. Se così non fosse, avvisatemi!
Questa breve guida è per sua natura sicuramente incompleta e non descrive per intero le caratteristiche del potente linguaggio Bash: lo ripeto, è una precisa scelta dovuta al fatto che ho preferito la sintesi alla completezza. Testi di riferimento più ampi e completi sono indicati in bibliografia; per gli utenti delle diverse versioni del sistema operativo UNIX, un primo utile riferimento è anche la pagina di manuale di Bash, accessibile direttamente dalla shell del sistema operativo mediante il comando “man bash”.
Nel testo saranno sicuramente presenti degli errori e degli aspetti poco chiari; in entrambi i casi sarò grato a quanti vorranno segnalarmeli via e-mail con un messaggio di posta elettronica inviato ad uno dei miei indirizzi: marco@aquilante.net, liverani@mat.uniroma3.it.
M.L.
Roma, Agosto 2011
Comandi interni, esterni e composti
Variabili, varibili d'ambiente e variabili speciali