Le Shell

La shell e' l'interfaccia utente dei sistemi unix.
Si tratta di un'interfaccia a comandi testuali, un po' come il DOS, ma molto piu' potente. Per gli utenti di un sistema unix e' importante conoscere la shell, anche se oggi molto lavoro viene svolto utilizzando piu' comode interfacce grafiche, che a loro volta richiamano i comandi della shell.
Il funzionamento di un sistema UNIX dipende in modo critico dalla shell, dato che tutte le procedure che il sistema usa al suo interno sono procedure di shell. La shell e' un po' il "collante" di un sistema Linux, occorre quindi conoscere la shell, anche se in modo non approfondito, per utilizzare e gestire un sistema UNIX.
Esistono molte shell, le shell disponibili nel sistema sono elencate nel file /etc/shells e sono files eseguibili che si trovano in genere in /bin. All'utente viene assegnata al login la shell associata al suo username nel file /etc/passwd ; l'utente la puo' cambiare col comando:

chsh


per passare da una shell all'altra, ad esempio alla c shell, basta eseguirla, e ci si trovera' in un nuovo processo, con la nuova shell ad interpretare i comandi dati a terminale. Ad esempio per passare alla csh si scrivera':

/bin/csh

Le principali shell sono:

Esiste anche uno standard, che definisce il comportamento della shell, ed un po' il comportamento dei vari unix: lo standard POSIX (Portable Operating System Interface). Il documento IEEE P1003.1 , pubblicato nel 1988, copre anche le chiamate a routine di sistema; il documento IEEE P1003.2 copre la shell, programmi di utilita' ed in generale l'interfaccia utente ed e' del 1992. Questi documenti, prodotti dopo anni ed anni di discussione, consistono di circa 2000 pagine e sono distribuiti dall'IEEE.
Linux e la bash sono aderenti allo standard.
Nel seguito ci concentreremo sulla bash shell; la bash e' molto simile alla sh ed alla korn shell, mentre la csh ha parecchie differenze sintattiche.




Caratteristiche principali della shell




La shell e' un interprete, legge ed esegue i comandi uno per uno, da terminale. In alternativa i files possono essere in un file eseguibile, dato alla shell come un file di input. Quando l'utente si collega viene creato un processo in cui la shell legge, interpreta ed esegue i comandi dell'utente, creando, per ognuno di essi un sottoprocesso. L'utente che scrive comandi al terminale sta in pratica parlando con un processo di shell.

Ogni file eseguibile puo' essere usato come fosse un comando della shell.

Ad ogni comando sono associati automaticamente 3 descrittori di files, denominati:


In caso si lavori da terminale questi 3 descrittori di file sono tutti associati al terminale medesimo. Vedremo poi come si possono usare per scrivere su files o passare dati da un comando all'altro.

Tutti i comandi hanno sintassi del tipo:

nome_comando opzione opzione opzione .. argomento argomento ...

Le opzioni (flags) sono in genere precedute dal segno - oppure -- ed in certi casi possono essere raggruppate
Ad esempio per vedere quali sono i files che iniziano con a , in ordine di creazione si puo' fare:

ls -lt a*

Un file eseguibile, che inizia con:

#!/bin/bash

viene considerato dal sistema una procedura di shell; eseguendo il file, ad esempio scrivendo il suo nome a terminale, verra' creato un processo in cui una shell esegue la procedura contenuta nel file.

La shell stessa puo' essere usata come comando di shell, e chiamandola le si possono dare opzioni che ne modificano il comportamento.

Quando un processo di shell parte esegue i comandi (di shell) contenti in alcuni files di inizializzazione , questi files possono essere utilizzati per personalizzare la shell; vengono eseguiti diversi files a seconda di come viene chiamata la shell ( di che tipo e' la shell). questo comportamento puo' essere controllato chiamando la shell con le opzioni:
--noprofile --norc --rcfile nome_file_di_inizializzazione


La shell puo' essere di 3 tipi: :