La shell

()

La shell e il terminale

L’interfaccia a linea di comando.

I sistemi Unix nascono negli anni ’70, ben prima della nascita delle interfacce gra che, quando l’unico modo di interagire con il computer era attraverso dei terminali, se non addirittura delle semplici telescriventi. Per cui, anche se oggi sono disponibili delle interfacce gra che del tutto analoghe a quelle presenti in altri sistemi operativi nati in tempi piu recenti, l’interfaccia a riga di comando resta di fondamentale importanza, dato che 30 anni di storia e migliaia di persone che ci hanno lavorato sopra per migliorarla, la hanno resa l’interfaccia utente piu potente e flessibile che ci sia.

La filosofia progettuale

Molte persone utilizzano un coltellino svizzero, dato che questo permette di avere in solo oggetto un discreto insieme di attrezzi diversi: coltello, forbici, cacciavite, seghetto, cavatappi. Pero e molto di cile vedere un professionista usare il coltellino svizzero per fare il suo lavoro. Un professionista ha bisogno di attrezzi professionali, e un carpentiere non costruisce una casa con un coltellino svizzero, ma con tanti attrezzi, ciascuno dei quali e specializzato nello svolgere un compito specifico. Le persone che hanno progettato l’interfaccia a riga di comando erano appunto dei profes-sionisti, che sapevano bene che anche se fare un programma unico per tutti i compiti poteva essere attraente per l’utente nale, che deve conoscere solo quello, in pratica questo sarebbe stato di cile da scrivere, mantenere e soprattutto estendere. Per cui da professionisti pensarono ai programmi come a degli attrezzi, e piuttosto che il coltellino svizzero realizzarono l’equivalente della cassetta degli attrezzi (quella che in gergo viene chiamata “Unix toolbox “), con in testa un criterio fondamentale: che ciascun programma facesse una sola cosa, nel miglior modo possibile.

Questa e la caratteristica fondamentale dei programmi base di un sistema unix-like come GNU/Linux. Ogni comando e progettato per eseguire un compito preciso. Ne abbiamo incontrati gia diversi nel corso della trattazione delle caratteristiche del sistema nel precedente capitolo: ls mostra la lista dei le, ps la lista dei processi, cp copia un le, chmod cambia i permessi, man mostra le pagine di manuale, ecc. I comandi hanno uno scopo preciso e precise funzionalita; le opzioni sono limitate e comunque speci che allo scopo del comando, e sono descritte dettagliatamente nella relativa pagina di manuale.

Il passo successivo fu quello di costruire anche un meccanismo che permettesse di combinare insieme i vari programmi, cosicche divenisse possibile eseguire, con una opportuna combinazione, anche dei compiti che nessuno di essi era in grado di fare da solo. Questo aveva il grande vantaggio, rispetto all’approccio del programma universale, di non dover attendere che l’autore dello stesso si decidesse a programmare la funzione in piu che serviva e che non era stata prevista all’inizio.

Questo e il ruolo della shell, cioe del programma che implementa l’interfaccia a riga di comando; e attraverso di essa che, concatenando vari comandi, si puo costruire l’equivalente di una catena di montaggio, in cui il risultato di un comando viene inviato al successivo, riuscendo così a realizzare compiti complessi con grande velocita e flessibilita, e spesso a fare anche cose che gli autori dei singoli programmi non si sarebbero neanche immaginati.

La modalità tradizionale con cui si utilizza l’interfaccia a riga di comando e attraverso una sessione di lavoro interattiva eseguita su un terminale. Un tempo questo accesso avveniva con la classica procedura di collegamento al sistema sulla console (torneremo su questo in sez. 4.3.5) dove un apposito programma, login, una volta autenticato l’utente, mette in esecuzione la shell.

Oggi, con la presenza sempre piu diffusa delle interfacce grafiche e la diffusione delle reti, si hanno molte altre modalità di accesso ad un terminale. Ad esempio si puo avere un opportuno programma, il cosiddetto emulatore di terminale, che opera all’interno dell’interfaccia gra ca creando un terminale virtuale a cui si accede all’interno di una nestra, oppure si puo accedere via rete attraverso un programma di collegamento remoto ed anche in questo caso esistono diversi programmi e diversi protocolli di collegamento (vedremo il principale in sez. 8.3). In tutti questi casi comunque, una volta predisposta l’opportuna interfaccia di accesso, viene sempre lanciata una shell.

Si ricordi comunque che per il kernel, secondo la filosofia fondamentale di Unix, la shell resta un programma come tutti gli altri; essa ha pero un compito fondamentale, che e quello di fornire l’interfaccia che permette di lanciare altri programmi. Inoltre e sempre la shell che permette di usufruire di tutta una serie di ulteriori funzionalit messe a disposizione dal kernel, come il controllo di sessione.

Dato che la shell e un programma come gli altri, essa puo essere realizzata in diversi modi, ed in effetti nel tempo sono state realizzate diverse shell. Anche in questo caso ci sono stati due loni di sviluppo, il primo deriva dalla prima shell realizzata, la Bourne shell, chiamata cos dal nome del suo creatore. La Bourne shell e la shell piu antica e le sue funzionalit sono anche state standardizzate nello standard POSIX.2. Il secondo lone nasce da un’altra shell, che usa una sintassi leggermente diversa, con delle analogie con quella del linguaggio C, e che per questo venne chiamata C shell. Ciascuno di questi due filoni ha dato vita a successive versioni di shell con funzionalit piu o meno avanzate; un breve elenco di quelle piu signi cative disponibili su GNU/Linux e il seguente:

Bourne shell e derivate.

{ La Bourne shell. La prima shell di Unix, in genere utilizzata semplicemente con il comando sh. Non viene praticamente piu usata. In GNU/Linux e sostituita da bash. che quando viene invocata come sh fornisce esclusivamente le funzionalit  previste dallo standard POSIX.2, disabilitando le varie estensioni di cui e dotata, o da dash. Sugli altri sistemi che rispettano lo standard POSIX.2, e di norma sostituita da ksh.

{ La Bourne-Again Shell. La bash e la shell di riferimento del progetto GNU. Il suo nome e un gioco di parole sul nome della Bourne shell, in sostanza una shell \rinata”. Viene utilizzata con il comando bash. Incorpora molte funzionalit avanzate, come la storia dei comandi (detta history), l’auto-completamento dell’input sulla linea di comando (per comandi, nomi di le e qualunque altra cosa, date le opportune estensioni), editing di linea, costrutti di programmazione complessi e molto altro (praticamente di tutto, si vocifera sia anche in grado di fare il ca e).

{ La Korn Shell La Korn shell (dal nome dell’autore) e stata la prima ad introdurre la history (l’accesso ai comandi precedenti) e l’editing della linea di comando. Ha il grosso difetto che gran parte delle funzionalit avanzate non vengono attivate di default, per cui occorre un ulteriore lavoro di con gurazione per utilizzarla al meglio. Viene utilizzata con il comando ksh. Non viene usata su GNU/Linux dato che bash ne ha tutte le caratteristiche; e pero utile conoscerne l’esistenza dato che e facile trovarla su altri Unix.

{ La ash. Una shell minimale, realizzata in poche decine di kilobyte di codice sorgente. Viene utilizzata con il comando ash. Ha molti comandi integrati, occupa poca RAM e poco spazio disco, ed ha poche funzioni (ma e conforme allo standard POSIX.2). Viene usata spesso nei dischetti di installazione o recupero e nei sistemi embedded, puo essere utile per sistemi dove si fa un grosso uso di script semplici perch e piu veloce di bash.

{ La Z shell. Un’altra shell avanzata. Viene utilizzata con il comando zsh. O re praticamente le stesse funzioni della Korn shell, ed altre funzionalit avanzate, come il completamento di comandi, le e argomenti, che pero trovate anche nella bash.

C shell e derivate.

{ La C shell.  Utilizza una sintassi con analogie a quella del linguaggio C. Viene utilizzata con il comando csh. In GNU/Linux non e disponibile essendo sostituita da tcsh.

{ La tcsh. E una evoluzione della C shell, alla quale aggiunge history e editing di linea e varie funzionalit avanzate. Viene utilizzata con il comando tcsh. Si trova su vari Unix proprietari, ma e poco di usa su GNU/Linux, pur essendo disponibile. Dato che e il principale strumento di lavoro di un amministratore professionista, la scelta della shell e spesso una questione strettamente personale. Qui parleremo pero solo di bash, che e la shell utilizzata in praticamente tutte le distribuzioni di GNU/Linux, e probabilmente e anche la piu potente e essibile fra quelle disponibili. L’unico motivo per volerne usare un’altra infatti è solo perchè siete maggiormente pratici con quella, nel qual caso probabilmente non avete bisogno di leggere questo capitolo.

Il riferimento piu immediato per il funzionamento della bash e la sua pagina di manuale, accessibile al solito con man bash. Probabilmente questa e una delle piu lunghe fra tutte le pagine di manuale: quella associata alla versione 4.2 consta di ben 5459 righe, ed in e etti piu che una pagina e un manuale. Per questo in seguito faremo riferimento, quando necessario, alle varie sezioni in cui essa e divisa.

/ 5
Grazie per aver votato!

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?