La shell di un sistema operativo è una applicazione particolare che permette all'utente di interagire direttamente con la macchina. In altre parole più semplici, la shell è un interprete di comandi. I comandi vengono digitati dall'utente attraverso la tastiera e vengono letti dalla shell, interpretati ed inviati al kernel per essere eseguiti.
La shell è pertanto una vera e propria interfaccia tra l'utente e la macchina, in grado di tradurre le istruzioni impartite con un linguaggio comprensibile dall'utente ma non da una macchina ad un linguaggio comprensibile dalla macchina ma non dall'utente.
Generalmente, la shell è testuale, ossia è costituita da una finestra di input/output esclusivamente di testo, anche se esistono shell che comprendono delle interfacce grafiche denominate GUI (Graphical User Interface).
In ambiente Linux è molto diffusa la bash (Bourne Again SHell). Essa riesce ad elaborare molti costrutti differenti permettendo all'utente di elaborare scripts anche complessi.
I comandi quindi vengono impartiti dall'utente alla macchina attraverso la shell, tali comandi vengono scritti sotto forma di istruzioni attraverso una riga digitabile che inizia dal prompt. Il prompt è un insieme di caratteri del tipo:
ma è comunque personalizzabile dall'utente root modificando nel file di configurazione .bash_profile la variabile PS1.
Il prompt dell'utente root inizia con il carattere # mentre quello di un utente normale e senza privilegi da root con $.
I comandi che la shell esegue sono dei programmi eseguibili contenuti in specifiche cartelle, come /bin e /sbin. Quando si digita il comando da far eseguire e successivamente si digita invio, la shell cerca in queste cartelle il comando relativo e lo esegue. Nel caso in cui il comando contiene un errore e non è possibile trovare il file nelle cartelle specifiche, allora la shell darà come output un errore del tipo:
bash: nome-comando : command not found
Un'altra precisazione importante da fare riguardo ai comandi impartibili alla shell riguarda le possibili opzioni che possono accompagnare il nome del comando.
Esistono infatti comandi che devono essere eseguiti necessariamente con delle opzioni o con degli argomenti, i quali possono essere più o meno facoltativi. Ad esempio, se voglio creare una cartella dovrò necessariamente precisare il nome della cartella e non mi basterà digitare il comando mkdir che crea la cartella.
La struttura generale di un comando è:
nome-comando -opzione argomento
Il nome del comando deve essere separato dalle opzioni da uno spazio, le opzioni iniziano con un trattino mai seguito da uno spazio, eventuali argomenti devono essere invece separati dalle opzioni da spazi.
Le opzioni sono costituite da un trattino ed una lettera, ciascuna lettera indica una opzione differente.
Vediamo qualche esempio di opzione per il comando ls, che serve per listare tutti i files presenti in una determinata cartella):
ls -l: lista estesa
ls -a: (All) lista di tutti i files
ls -i: (inode) visualizza inode
Per usufruire di tutte le tre opzioni il comando sarà
ls -lai
Se si vogliono informazioni su un file preciso occorrerà aggiungere, dopo le opzioni, un argomento che indica il nome del file completo di estensione, tipo:
ls -l nome_file.ext
Una lista dei comandi più importanti è riportata nelle parti successive della presente guida.
Un'altra caratteristica da conoscere della shell riguarda la possibilità di poter scrivere più comandi su una unica riga. Questi verranno eseguiti in serie dopo aver digitato Invio. Se la riga risulta essere troppo lunga, è possibile scrivere parte del comando e poi utilizzare il carattere \ per andare a capo con Invio. Se infatti parte del comando viene seguita dal carattere \ e poi da Invio non viene eseguita. Per eseguire tutto il comando, spezzato in due o più righe, occorre ricordare di non utilizzare il carattere \ per chiudere l'ultima riga ma digitare Invio esattamente come se fosse un comando completo. In questo caso, tutte le righe precedenti in cui era stato utilizzato il carattere \ verranno eseguite come se fosse una unica riga.
Cosa e' possibile fare con una shell?
Abbiamo già detto che la shell è un interprete di comandi in grado di trasmettere al kernel le nostre istruzioni. Oltre a questo però la shell permette di creare programmi in grado di eseguire determinate funzioni ed operazioni particolari in sequenza. Ogni volta che un comando viene impartito, la shell esamina la stringa, decodifica (se presenti) i vari caratteri jolly, cerca il comando voluto nelle cartelle /bin e /sbin, cerca la cartella in cui si sta lavorando e, se serve, ne analizza i file presenti all'interno, apre una subshell in cui verrà eseguito il comando, collega l'input all'output, esegue il comando nella subshell creata ad hoc, chiude la subshell e mostra i risultati. Il tutto in qualche frazione di secondo per i comandi più semplici.
Questo è quanto viene eseguito dalla shell nei comandi standard ma, come dicevo, è possibile creare dei veri e propri programmi (script) che contengono molte istruzioni che vengono eseguite automaticamente.