Corso Di Linux

Liceo Fermi, Bologna - Marcello Galli, novembre 2009

La shell

La shell e' l'interfaccia di base per gli utenti dei sistemi Unix ( e Linux). La shell e' un'interfaccia a comandi testuali: un programma che legge i comandi scritti su una finestra del video, e li esegue. E' un po' come il vecchio DOS (per chi lo ricorda), ma e' molto piu' potente, infatti e' un vero proprio linguaggio di programmazione. Un file che contiene un programma, ed e' contrassegnato come eseguibile, viene eseguito dalla shell, se si scrive il suo nome sul terminale.

La shell era l'interfaccia che si usava quando la grafica non esisteva ancora; adesso molte cose si fanno con interfacce piu' comode, usando il mouse; ma ci sono ancora situazioni in cui la shell e' indispensabile: per lavorare su computer via rete, (per usare un'interfaccia grafica via rete ci vogliono collegamenti attorno ai 5-10 Mbit/sec) o su dei server, che non hanno la grafica. Oppure serve per venire a capo di problemi del computer, quando l'interfaccia grafica non funziona. Inoltre il funzionamento di un sistema Unix dipende in modo critico dalla shell, dato che il sistema al suo interno usa procedure di shell per fare tante cose e a volte occorre darci un'occhiata.

Ma usare la shell serve sopratutto per capire come funziona il sistema; le interfacce grafiche, per loro natura, hanno un numero limitato di opzioni e nascondono il sistema all'utente, che non sa mai cosa sta succedendo dietro le quinte ed e' perso appena qualcosa non funziona o se vuole fare qualcosa di particolare, non previsto dalle procedure grafiche.

Quindi, se si vuole capire un sistema Linux, bisogna imparare la shell; poi si usa l'interfaccia preferita, ma si sa cosa si sta facendo e non si e' piu' schiavi dell'interfaccia, ma padroni del proprio computer.

Ci sono diversi tipi di shell, circa una decina, come al solito su una macchina linux si possono usare tutte, anche contemporaneamente, ma noi vedremo solo la shell di nome "bash", quella piu' usata.

I comandi che si danno alla shell hano tutti sintassi simile: il comando vero e proprio, in genere una abbreviazione impronunciabile, seguito, sulla stessa linea, da parametri che gli dicono in dettaglio cosa fare; i parametri sono preceduti da un segno meno:"-", poi ci sono, sempre di seguito, degli argomenti, che in genere sono files su cui si opera od altre specifiche.

Ad esempio per fare una lista di files si scrive:
ls
per fare una lista piu' dettagliata:
ls -l
per fare la lista dettagliata del file di nome "pollicino":
ls -l pollicino

Se uno si dimentica i paramtri o gli argomenti, cosa che succede sempre, li chiede al computer. C'e' un comando che da informazini sui comandi e si chiama: "man", che sta per manual (ovvero manuale).

Ad esempio per avere informazioni sul comando ls si scrive:
man ls

Usare questi comandi puo' sembrare un po' ostico, ma in realta' se ne usano pochi, sempre gli stessi, e la cosa migliore e' scriverli su un fogliettino da tenere vicino al computer. Quando si ha bisogno di sapere dei dettagli si usa il comando di aiuto: "man".

Ci sono alcune cose comode della shell, che conviene sapere:

Infine un suggerimento sull'uso del mouse: il copia ed incolla (cut and paste) in Linux si puo' fare senza tastiera, solo col mouse. Si usa il tasto sinistro per selezionare, poi ci si sposta e si clicca sul tasto centrale per copiare.

Puo' anche essere utile sapere che per interromere un comando si usa il tasto Control assieme al tasto C.

Nomi di files

Spesso si usa la shell per guardare o modificare files, bisogna sapere alcune cose su come sono fatti i nomi dei files.

Comandi per files e cartelle

Un comando che crea un file (vuoto) e': "touch" questo comando "tocca" il file e gli aggiorna la data di ultimo accesso, ma se il file non esiste lo crea.

touch pincopallo crea il file di nome pincopallo

per fare un directory di usa il comando mkdir (che sta per: "make directory"), per distruggere una directory si usa il comando "rmdir" (che sta per: "remove directory"). Una directory si puo' eliminare solo se e' vuota.

Per spostarsi in una directory si usa il comando: "cd" ( che sta per "change direcotory"). Il comando "pwd" vi mostra in che directory siete.

Per vedere il contenuto di un file di nome pincopallo si puo' dare il comando: cat pincopallo o meglio il programma "more". Scrivendo: more pincopallo vedete il contenuto del file una pagina alla volta. (premete la lettera q per uscire dal programma more, q sta per "quit" che significa "smetti").

Per cambiare il nome ad un file si usa il comando "mv", che sta per "move". mv pollicino strega cambia nome al file "pollicino" che adesso si chiama "strega". mv sposta anche files da una cartella ad un'altra.

Ci sono anche tanti altri comandi per i files, eccone alcuni:

Bisognerebbe fare qualche esercizio per abituarsi a spostarsi nel file system con questi comandi, senza perdersi. La gente abituata a certe interfacce grafiche fa fatica ad utilizzare una semplice struttura gerarchica come il file system.

Input ed output

Ogni comando in unix ha un input, un output, ed anche un output speciale, dove vengono scritti i messaggi di errore.

Questi 3 canali di comunicazione si chiamano stdin, stdout ed stderr, che sta per: standard input, standard output e standard essor. A chi conosce il linguaggio C questo ricordera' qualcosa, non per niente Unix (e Linux) sono scritti in C.

Quando usate la shell per dare comandi: l'input e' la tastiera, l'output la finestra terminale, lo standard error pure.

Ogni comando lavora un po' come una "pipe" cioe' un tubo, da una parte si butta dentro l'input, dall'altra esce l'output.

Finche' si lavora dando comandi da tastiera la cosa non significa granche', ma il bello e' che potete decidere di collegare l'output ad un file, e scrivere su un file, oppure di unire 2 comandi, in modo che l'uscita di uno finisce nell'ingresso dell'altro. In questo modo si creano comandi composti: mettendo insieme comandi semplici si montano comandi complicati; e' come collegare dei tubi.

Il comando piu' semplice per fare queste cose e' il comando "cat"; il nome significa "concatenate" perche' puo' servire per mettere insieme piu' files, come vedremo piu' avanti. cat fa una cosa semplice; copia il suo input sul suo output. Siccome il suo output e' il terminale se facciamo: cat pollicino vediamo sul terminale il contenuto del file "pollicino".

C'e' un altro comando che scrive su terminale, ed e': echo. echo "stringa" vi scrive la stringa su terminale (echo serve nelle procedure, cioe' nei files che contengono comandi di shell, da eseguire come un unico programma).

Per collegare i comandi, si usano i 3 simboli : "<" , ">" ed "|"

Vediamo qualche esempio:

ls > listafiles

crea un file di nome listafiles con la lista dei files della cartella (output del comando ls)

cat > nuovofile

questo prende tutto quello che scrivete sul terminale e lo mette nel file di nome: "nuovofile". Per riprendere possesso del terminale dovete premere il tasto control assieme alla lettera "d". Cntrol/d significa: fine del file. Quando il comando cat lo incontra pensa che il suo input sia finito e smette di lavorare.

cat nuovofile | more

cat mette il file: "nuovofile" sul suo output, ma il suo output finisce dentro il comando "more", che vi fa vedere il file una pagina per volta. Analogamente ls | more vi fa vedere la lista dei files una pagina per volta.

Il simbolo ">>" si usa al posto di ">" se si vuole aggiungere qualcosa al file su cui va l'output, che con ">" viene riscritto completamente da capo.

Permessi di accesso ai files

Abbiamo gia' descritto i permessi di accesso ai files. Per cambiare permessi ad un vostro file si usa il comando chmod (abbreviazione per "change mode").

La sintassi puo' sembrare un po' involuta. Il primo parametro e' una combinazione delle lettere a,o,u,g , che stanno per all (tutti), others (gli altri) , u (user), g(group) ed indicano a chi si danno i permessi, poi c'e' un + se si aggiunge il permesso, un - se si toglie, poi ci sono le lettere: w,r,x per scrittura(write), lettura (read) ed esecuzione (execute) Vediamo qualche esempio:

Variabili di ambiente e shell come linguaggio

La shell e' un vero e proprio linguaggio di programmazione e si usa per fare procedure, cioe' files contenenti comandi di shell che possonoe essere eseguiti, come un qualunque programma. La shell quindi ha tutti i soliti costrutti dei linguaggi di programmazione: if, then, else, le istruzioni ripetute, (i loop), con while, for ; strutture simili a quelle che si possono trovare nel Pascal, nel C od in altri linguaggi.

Siccome e' un linguaggio ha anche delle variabili, non si deve definire il loro tipo prima di usarle perche' in genere sono delle stringhe; la shell non e' fatta per scrivere programmi di calcolo.

Alcune di queste variabili definiscono il comportamente della shell, fra queste ricordiamo:

Per vedere il valore di una variabile si puo' usare il comando echo: echo $HOME vi mostra la vostra cartella principale. Il carattere "$" serve a dire alla shell che HOME e' una variabile e non una stringa, e va sostituita con il suo valore, se scrivete echo HOME , senza il "$" vedete la scritta "HOME", infatti echo scrive una stringa sul terminale.

Per vedere quali sono le variabili gia' definite nel vostra ambiente di shell potete scrivere: "export"; sono tante, ma non serve conoscerle tutte. Quello che e' interessante e' che le potete cambiare.

Vediamo un esempio: PS1 e' il prompt, e spesso e' fatto in modo da farvi vedere il vostro nome o la macchina su cui state lavorando. Se fate: PS1="xxx " avrete ad inizio riga tre x, seguite da uno spazio. Le variabili si assegnano o si cambiano con un segno "=", ma valgono solo nella finestra in cui siete; se volete che restino valide anche all'interno dei comandi che date dopo, dovete usare il comando export. Ad esempio il comando: export PATH=".:$PATH" , aggiunge un punto (la directory corrente) alla directory in cui cercare comandi, e, con export, vale anche nelle finestre che fate a partire dalla vostra.

Interazione col sistema utilizzando la shell

In unix ci sono molti comandi per controllare e gestire il vostro computer, per utilizzarli si una una finestra terminale e si scrivono al terminale i loro nomi, la shell li fara' partire e vi mostrera' i risultati.

Vediamo alcuni di questi programmi: