Corso di Sistemi Operativi

La shell

 

La prima cosa con la quale un utente si trova a dover interagire, dopo essere entrato nel sistema, è un prompt di questo tipo:

[myname@localhost ~]$

dove myname è il proprio nome utente, localhost è il nome della macchina (questo è il nome dato di default da molte distribuzioni, ma è possibile personalizzarlo in qualsiasi momento tramite il comando hostname) e il carattere ~ indica che ci troviamo all'interno della nostra directory di lavoro predefinita (generalmente /home/myname/).

Con il prompt la shell informa l'utente di essere pronta ad accogliere i suoi comandi.
Normalmente essa mostra uno dei caratteri '$', '%', oppure '#', ma è possibile personalizzare anche questo (come avremo occasione di constatare spesso in futuro, i sistemi Unix - e Linux in particolare - consentono un elevato grado di personalizzazione del proprio ambiente di lavoro).

La shell è semplicemente un processo utente, nemmeno tanto sofisticato, che ascolta sulle porte di I/O della tastiera in attesa di comandi digitati dall'utente.
Occorre precisare che tutto l'I/O, eccezion fatta per pochissimi casi, passa attraverso il kernel, che ne organizza le operazioni, impedendo ai processi di ostacolarsi a vicenda.
Quando l'utente immette una linea di comando, il kernel raccoglie i caratteri immessi in un buffer interno, presentandoli nel contempo all'utente tramite lo schermo.

Non appena viene premuto il tasto [Invio], il kernel passa la riga immessa alla shell, che ne estrae la prima parola, assumendo che sia il nome di un programma che deve essere invocato oppure un comando interno (se previsti dalla shell).
Se trova il programma specificato, la shell esegue una chiamata di sistema chiedendo al kernel di creare un nuovo processo figlio e, se la richiesta ha esito positivo, essa si porta nello stato di sleep, in attesa che il processo finisca l'esecuzione.
Se la prima parola della riga immessa viene riconosciuta come un comando interno, allora esso viene eseguito direttamente all'interno della shell.
Se non si verifica nessuno dei due casi precedenti, allora viene emesso un messaggio di errore del tipo:

command not found

Dopo aver eseguito il programma o aver segnalato l'errore, la shell ripropone un altro prompt in attesa di un altro comando.

I comandi possono avere degli argomenti; ad es. se si vuole copiare un file di nome 'sorgente.txt' in uno chiamato 'destinazione.txt', occorre specificare questi due nomi al programma cp che si occupa della copia.
In questo caso daremo alla shell il comando:

$ cp sorgente.txt destinazione.txt

ed essa si occuperà di avviare il programma cp, passandogli i suoi argomenti come stringhe di caratteri.
Tuttavia, non tutti gli argomenti sono nomi di file, ad es. nel comando:

$ tail -20 sorgente.txt


il primo argomento, -20, indica al programma tail di visualizzare le ultime 20 righe del file 'sorgente.txt'.

Gli argomenti che controllano l'esecuzione di un comando o che specificano un valore opzionale, sono detti flag, e per convenzione sono preceduti dal carattere '-' (meno), al fine di evitare ambiguità.
Infatti il comando:

$ tail 20 sorgente.txt


indica a tail di mostrare le ultime 10 righe di un file chiamato '20' e, successivamente, le ultime 10 righe del file 'sorgente.txt'.

Per facilitare la specifica dei nomi di file e per velocizzare molte operazioni, la shell solitamente accetta dei caratteri magici o metacaratteri (wild cards).
Ad es. un asterisco ('*') corrisponde a tutte le possibili stringhe, cosicché il comando:

$ ls *.txt

chiede al programma ls di elencare tutti i file contenuti nella directory corrente e terminanti con l'estensione '.txt'.

Abbiamo accennato all'inizio della lezione al fatto che la shell non legge direttamente dall'I/O della tastiera, ma riceve i caratteri immessi dall'utente per mezzo del kernel.
In particolare, quando un qualsiasi programma (e quindi anche la shell) viene mandato in esecuzione, esso ha accesso automaticamente a tre file standard, chiamati rispettivamente:
1) standard input, per la lettura;
2) standard output, per la scrittura;
3) standard error, per la scrittura dei messaggi di errore.

Solitamente, per default questi programmi sono associati al terminale, per cui di fatto lo standard input legge dalla tastiera e standard output e standard error scrivono sullo schermo.
Molti programmi Unix leggono dallo standard input e scrivono sullo standard output come comportamento di default.

 

Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet