Next: , Previous: Nozioni elementari sul sistema operativo unix, Up: Nozioni elementari sul sistema operativo unix


2 La shell

Sui PC dell'aula computer e' installato il sistema operativo unix.

Questo sistema operativo e' molto diverso dal diffuso sistema windows.

Una caratteristica del sistema unix e' la possibilita' di dare comandi da una finestra terminale per eseguire determinate operazioni (la parola terminale indica genericamente qualsiasi dispositivo attraverso cui sia possibile interagire con il sistema operativo).

Nell'aula computer, una finestra terminale si ottiene cliccando col bottone destro del mouse sullo sfondo e selezionando Open terminal: compare una finestra con una scritta in alto a sinistra. La scritta e' qualcosa di simile a -bash-3.00$ e il cursore si trova immediatamente alla sua destra.

La scritta si chiama prompt ed e' prodotta da un programma che si chiama genericamente shell: la shell presente sui PC dell'aula computer si chiama bash (che sta per Bourne-Again SHell).

La shell e' un programma essenziale del sistema operativo unix: il suo scopo e' quello di interpretare tutto cio' che l'utente digita e interagire di conseguenza con le varie parti del sistema operativo.

Vedete la shell come l'intermediario fra voi e il sistema operativo.

Quando la shell entra in esecuzione (nella finestra terminale), scrive il suo prompt e attende che l'utente digiti qualcosa: se l'utente non digita nulla, la shell rimane in attesa.

Per passare alla shell cio' che si e' digitato nella finestra terminale, bisogna concludere pigiando il tasto Invio.

Per esempio, se digitate il comando date seguito da Invio, la shell legge cio' che avete scritto (la stringa date), lo riconosce come un comando unix, lo fa eseguire dal sistema operativo e riporta sulla finestra terminale il risultato di questa operazione, cioe' l'output del comando date, che e' la data e l'ora corrente:

     dschgrazlin2:1> date
     Tue Feb  5 12:23:03 CET 2008
     dschgrazlin2:2>

(In questo esempio, il prompt della shell e' dschgrazlin2:1>, diverso da quello citato prima: l'utente puo' personalizzare il prompt della shell)

Il carattere Invio non appare, ma e' stato digitato dopo la stringa date. La riga successiva e' stata prodotta dal comando date e viene restituita dalla shell al termine dell'esecuzione del comando. Dopo di che, la shell ripresenta il suo prompt, in attesa del prossimo comando.

Cio' che l'utente digita al prompt della shell puo' essere classificato in 3 categorie:

comandi unix
Se la stringa digitata dall'utente e conclusa con Invio e' un comando unix, la shell lo manda in esecuzione e restituisce l'output prodotto da esso (o anche nulla, se il comando non produce output)
comandi diretti alla shell stessa
Se la stringa digitata dall'utente e conclusa con Invio viene riconosciuta dalla shell come un comando diretto a se stessa, la shell lo esegue senza interagire con il sistema operativo.

Dal punto di vista dell'utente, c'e' poca differenza fra questi comandi e quelli del punto precedente: l'utente in ogni caso digita qualcosa e ottiene una risposta corrispondente.

stringhe prive di senso
Se la stringa digitata dall'utente e conclusa con Invio non viene riconosciuta dalla shell come un comando unix o un comando diretto a se stessa, la shell risponde con un messaggio di errore.

Ad esempio:

     
          dschgrazlin2:2> Hey, shell: dimmi qualcosa 
          bash: Hey,: command not found
          dschgrazlin2:3>

In questo caso, la shell constata che la stringa Hey, non e' un comando valido e lo segnala.

Osservate una struttura tipica dei messaggi di errore in ambiente unix: prima c'e' il nome del programma che ha generato il messaggio di errore seguito da doppio punto (bash:), poi l'oggetto dell'errore stesso seguito da doppio punto (Hey,:), infine la breve spiegazione di cio' che non va (command not found).

2.1 Esempi

Provate a digitare le cose seguenti al prompt della shell in un terminale:

date
Come gia' visto, questo e' il comando unix per ottenere data e ora correnti.
whoami
Questo e' un altro comando unix il cui output e' il vostro "login name", cioe' il nome che avete come utenti del sistema. Ad esempio:
     
          dschgrazlin2:1> whoami
          balducci
          dschgrazlin2:2> 

echo Hello,world!
Il comando unix echo riscrive sul terminale tutto cio' che lo segue (in questo caso la stringa Hello,world!)
A="I am a string"
(digitate anche le virgolette)

Questo non e' un comando unix, ma un comando della shell. La shell puo' essere programmata con un linguaggio ad essa intelleggibile. Questo linguaggio consente di fare cose anche molto complicate ed e' senz'altro al di fuori dello scopo di queste note. Cio' che avete digitato in questo esempio e' un'assegnazione: cioe' la stringa "I am a string" e' stata assegnata alla variabile A. La shell esegue questa assegnazione e non risponde nulla in output. Tuttavia, potete vedere che la shell ha eseguito il comando ad essa diretto digitando echo $A: in questo caso passate al comando unix echo (visto sopra), il contenuto della variabile A (per usare il contenuto di una variabile definita dalla shell si usa il suo nome preceduto dal segno del dollaro). Quindi e' come se aveste digitato: echo "I am a string" e il comando echo riscrive sul terminale i suoi argomenti.

2.2 Sommario

L'interazione fra l'utente e il sistema operativo unix attraverso un terminale e' mediata dalla shell.

L'utente digita stringhe di caratteri seguite da Invio e la shell interpreta queste stringhe e svolge delle azioni ad esse conseguenti.

Tutto cio' che digitate in un terminale passa attraverso la shell, che si comporta di conseguenza: esegue comandi unix, esegue istruzioni nel suo linguaggio o semplicemente segnala che avete digitato qualcosa di sbagliato.