L'interprete di comandi è l'interfaccia tra l'utente e il sistema operativo, da cui il suo nome in inglese «shell», che significa «guscio».
La shell è incaricata di fare da intermediario tra il sistema operativo e l'utente mediante dei comandi inseriti da quest'ultimo. Il suo ruolo consiste quindi nel leggere la linea di comando, interpretare il suo significato, eseguire il comando e poi rinviare il risultato in uscite:
La shell è anche un file eseguibile incaricato di interpretare i comandi, di trasmetterli al sistema di rinviare il risultato. Esistono più shell, fra le più diffuse sh (dette «Bourne shell») ci sono bash («Bourne again shell»), csh («C Shell»), Tcsh («Tenex C shell»), ksh («Korn shell») e zsh («Zero shell»). I loro nomi corrispondono generalmente al nome dell'eseguibile.
Ogni utente ha una shell di default, che viene avviata all'apertura di un prompt. La shell di default è precisata nel file di configurazione /etc/passwd nell'ultimo campo della linea corrispondente all'utente. È possibile cambiare shell in una sezione eseguendo semplicemente il file eseguibile corrispondente, ad esempio:
/bin/bash
.
La shell si inizializza leggendo la propria configurazione globale (in un file della cartella /etc/), poi leggendo la configurazione propria dell'utente (in un file nascosto, il cui nome comincia con un punto, posto nella cartella di base dell'utente, cioè /home/nome_dell'_utente/.file_di_configurazione), poi visualizza un prompt come segue:
terminale:/directory/attuale$
.
Per default nella maggior parte delle shell il prompt è composto dal nome del terminale, seguito da due punti (:), dalla cartella corrente, poi da un carattere che indica il tipo di utente connesso:
«$» indica che si tratta di un utente normale;
«#» indica che si tratta dell'amministratore, detto «root».
Una linea di comando è una stringa di caratteri costituita da un comando, corrispondente ad un file eseguibile dal sistema oppure da un comando della shell nonché da alcuni parametri opzionali:
ls -al /home/nome_utente/
.
Nel comando qui sopra, ls è il nome del comando, -al e /home/nome_utente/ sono dei parametri. I parametri che cominciano con - sono detti opzioni. Per ogni comando esiste generalmente un certo numero di opzioni che possono essere dettagliate digitando uno dei comandi seguenti:
comando --help
comando -?
man comando
All'esecuzione di un comando, si crea un processo. Questo va ad aprire tre flussi:
stdin, detto ingresso standard, nel quale il processo leggerà i dati in entrata. Da default stdin corrisponde alla tastiera; STDIN è identificato dal numero 0;
stdout, detto uscita standard, nel quale il processo scriverà i dati in uscita. Da default stdin corrisponde allo schermo; STDOUT è identificato dal numero 1;
stderr, detto errore standard, nel quale il processore scriverà i messaggi di errore. Da default stderr corrisponde allo schermo. STDERR è identificato dal numero 2:
Da default all'esecuzione di un programma, i dati sono quindi letti partendo dalla tastiera e il programma invia la propria uscita e i propri errori sullo schermo, ma è possibile leggere i dati partendo da qualsiasi periferica d'entrata, anche da un file e inviare l'uscita su una periferica di visualizzazione, un file, ecc.
Linux, come tutti i sistemi di tipo Unix, ha dei meccanismi che permettono di reindirizzare le entrate-uscite standard verso dei file. Così, l'utilizzo del carattere «>» permette di reindirizzare l'uscita standard di un comando posto a sinistra verso il file posto a destra:
ls -al /home/nome_utente/ > lista.txt
echo "lista" > /etc/file_di_configurazione
Il comando seguente è equivalente ad una copia di file:
cat lista1 > lista2
. La ridirezione «>» ha lo scopo di creare un nuovo file. Quindi, se esiste un file con lo stesso nome, questo sarà eliminato. Il comando successivo crea semplicemente un file vuoto:
> file
.
L'impiego di un doppio carattere «>>» permette di concatenare l'uscita standard al file, cioè aggiungere l'uscita al file, senza eliminarlo. Allo stesso modo, il carattere «<» indica una ridirezione dell'entrata standard. Il comando successivo invia il contenuto del file lista.txt in entrata del comando cat, il cui solo scopo è di visualizzare il contenuto sull'uscita standard (esempio inutile ma formativo):
cat < lista.txt
.
Infine l'utilizzo della ridirezione «<<» permette di leggere sull'entrata standard fino a che la stringa posta a destra sia incontrata. Così, l'esempio seguente leggerà l'entrata standard fino a che la parola STOP non arrivi, poi visualizzerà il risultato:
cat << STOP
.
I pipe (in italiano «tubi") costituiscono un meccanismo di comunicazione proprio ad ogni sistema UNIX. Un pipe, simbolizzato da una barra verticale (carattere «|»), permette di attribuire l'uscita standard di un comando all'entrata standard di un'altra. Così nell'esempio seguente, l'uscita standard del comando ls -al è inviato al programma sort incaricato di smistare il risultato in ordine alfabetico:
ls -al | sort
.
In questo modo è possibile incatenare un certo numero di comandi per tubi successivi. Nell'esempio che segue il comando visualizza tutti i file della cartella corrente, seleziona le linee contenenti la parola "zip" (con il comando grep) e conta il totale delle linee:
ls -l | grep zip | wc -l
.
Foto: © Pixabay.