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