Basi di Linux – La Shell

La Shell

La shell è molto importante perchè consente di metterci nelle condizioni per poter impartire i comandi al kernel, che è il cuore del sistema operativo (esattamente la stessa cosa succedeva qualche anno fa con l’MS-DOS – Chi di voi non ha mai utilizzato l’MS-DOS?).

In Linux vengono principalmente utilizzate quattro shell:

– BASH (Bourne Again SHell)
– PDKSH (Public Domain Korn SHell)
-TCSH
-Z
Se vogliamo visualizzare tutte le shell supportate dalla nostra distribuzione, possiamo impartire il comando:

[roberto@diamondhead roberto]$ more /etc/shells

Vedremo tutte le shells disponibili del nostro sistema operativo.

Con le ultime distribuzioni di Linux abbiamo anche la BASH2 che è una BASH un pò più evoluta. Può essere utilizzata una qualsiasi di queste shell ma inizialmente, nel sistema operativo Linux (almeno su questa distibuzione), viene
installata la shell BASH, ed è proprio questa che tratteremo.

In qualsiasi momento possiamo cambiare shell digitando uno dei nomi di shell che troviamo nel file /etc/shells. Proviamo a digitare:

[roberto@diamondhead roberto]$ bash2

adesso ci troviamo nella shell bash2. Per uscire da una shell basta digitare:

[roberto@diamondhead roberto]$ exit

E si torna alla shell originale. Proviamo ora ad entrare nella shell sh:

[roberto@diamondhead roberto]$ sh
sh-2.04$

vediamo che il prompt dei comandi si presenta leggermente diverso da quello precedente. Possiamo uscire da questa shell anche premendo contemporaneamente CTRL + D.

sh-2.04$ [CTRL +D]

Una volta fatto il login sul sistema, come prompt di comandi abbiamo una serie di informazioni che ci identifica: “[roberto@diamondhead roberto]$”, dove roberto è il nome dell’utente separato da una chiocciola, segue poi il nome dell’host e il nome della directory dove attualmente ci troviamo “/home/roberto”. Il dollaro finale sta ad indicare che ci troviamo in modalità utente normale, se si fosse fatto il login come root, cioè come
amministratore, il simbolo sarebbe un # (diesis). In questo momento possiamo impartire tutti i comandi che vogliamo. Prima però di proseguire dovremo far partire il server grafico in modo che voi possiate vedere cosa sto digitando nel mio terminale. Questo per comodità, in ogni caso utilizzeremo i tools grafici di sistema il meno possibile:

[roberto@diamondhead roberto]$ startx

Una volta caricato il desktop apriremo la console di sistema cliccando sul terminale (la terza icona in basso partendo da sinistra). Bene, adesso proviamo a digitare ls:

[roberto@diamondhead roberto]$ ls

vedremo tutti i file contenuti nella directory corrente. Se vogliamo vedere tutti i file, anche quelli nascosti, incolonnati con i relativi permessi digitiamo:

[roberto@diamondhead roberto]$ ls -la

l’opzione “l” subito dopo il trattino mi fa vedere i dettagli sui file, come permessi, nome dell’utente, nome del gruppo, data di creazione e così via, mentre il flag “a” mi visualizza i file nascosti, quelli che iniziano con il punto (sia se si tratta di file normali -con il colore vere e bianco, sia se si tratta di directory – in blu). Nel caso in qui vogliamo visualizzare le directory seguite da uno slash (questo è utile se NON sia ha la possibilità di vedere i colori), possiamo utilizzare il flag “F:

[roberto@diamondhead roberto]$ ls -F

Ovviamente si può utilizzare questi flag assieme:

[roberto@diamondhead roberto]$ ls -laF

Adesso vediamo com’è organizzato il file system di Linux. Proviamo
a dare il comando:

[roberto@diamondhead roberto]$ pwd
/home/roberto

vediamo in questo momento in quale directory ci troviamo, cioè in /home/roberto. Infatti pwd sta per print work directory. Proviamo a risalire di directory:

[roberto@diamondhead roberto]$ cd ..
[roberto@diamondhead /home]$

adesso, come dice anche il nostro prompt di comandi, ci troviamo nella directory /home. Quello slash prima di home sta ad indicare che il path è assoluto. Se non ci fosse lo slash sarebbe un riferimento relativo, cioè riferito alla directory dove attualmente ci troviamo. Quindi, se noi vogliamo ritornare alla nostra home
directory faremo:

[roberto@diamondhead /home]$ cd roberto/

in questo modo non c’è lo slash prima del nome di directory e quindi facciamo riferimento alla directory roberto in modo relativo, cioè rispetto a dove siamo.
Risaliamo un attimo di livello:

[roberto@diamondhead roberto]$ cd ..
[roberto@diamondhead /home]$

ora ci troviamo dentro la directory home. Se vogliamo entrare nella nostra directory roberto specificando un path assoluto possiamo scrivere:

[roberto@diamondhead /home]$ cd /home/roberto/

con lo slash iniziale si specifica un percorso assoluto. Se vogliamo andare alla radice, cioè al padre di tutte le directory scriviamo:

[roberto@diamondhead /home]$ cd /
[roberto@diamondhead /]$

diamo un:

[roberto@diamondhead /]$ ls
bin dev home lost+found mnt proc sbin tmp var
boot etc lib misc opt root tftpboot usr

e vedremo tutte le principali directory del nostro file system. In sostanza è come se ci trovassimo in C: di windows.
Adesso proviamo ad andare dentro:

[roberto@diamondhead /]$ cd bin/
[roberto@diamondhead /bin]$ ls

qui troviamo parte dei comandi di linux. Vediamo che c’è il comando “ls”, il comando “pwd”, etc. Risaliamo di directory e torniamo indietro alla directory radice, chiamata anche ROOT DIRECTORY:

[roberto@diamondhead /bin]$ cd ..

[roberto@diamondhead /]$ ls

andiamo dentro la directory boot:

[roberto@diamondhead /]$ cd boot/
[roberto@diamondhead /boot]$ ls

qui troviamo i programmi del kernel di linux. Questi programmi vengono caricati al momento del boot. In particolare il file “vmlinux-2.4.2-2” è il primo programma che viene caricato quando selezioniamo la voce “Linux” dal dual boot. Senza questo file Linux con partirebbe.
Torniamo ancora indietro:

[roberto@diamondhead /boot]$ cd ..
[roberto@diamondhead /]$ ls

entriamo dentro:

[roberto@diamondhead /]$ cd var/
[roberto@diamondhead /var]$ ls

qui c’è un pò di tutto. Una directory molto importante è “log”. Qui dentro ci sono tutti i file di log del sistema. Se un domani vogliamo controllare gli accessi al sistema dovremo andare qui dentro.
Proviamo a farlo:

[roberto@diamondhead /var]$ cd log/
[roberto@diamondhead log]$ ls

eccoli qua, organizzati per tipologia di servizi. Proviamo ora ad anadare dentro la directory /mnt/ però usando un path relativo. Intanto vediamo dove ci troviamo:

[roberto@diamondhead log]$ pwd
/var/log

ora la directory “mnt” si trova allo stesso livello di var, quindi faremo:

[roberto@diamondhead log]$ cd ../../mnt/
[roberto@diamondhead /mnt]$ ls

chiaro?
Qui dentro ci sono i dispositivi di lettura/scrittura come floppy disk, cdrom, masterizzatori etc. Più avanti vedremo anche come utilizzarli. Per ora ci basta sapere che sono qui dentro. Adesso ritorniamo alla nostra home directory (provare a chiedere come si ritorna….):

[roberto@diamondhead /mnt]$ cd /home/roberto/
[roberto@diamondhead roberto]$ ls

Se vogliamo creare in file possiamo scrivere:

[roberto@diamondhead roberto]$ touch pippo

verrà creato un file vuoto. Se vogliamo cancellarlo si usa:

[roberto@diamondhead roberto]$ rm pippo

per creare una nuova directory si scrive:

[roberto@diamondhead roberto]$ mkdir newdir

per cancellare una directory vuota:

[roberto@diamondhead roberto]$ rmdir newdir

se invece la directory NON è vuota, cioè se al suo interno ha dei file o altre directory si usa il comando:
[roberto@diamondhead roberto]$ rm -r newdir/

La shell BASH ci da anche la possibilità di correggere ciò che abbiamo digitato.

Caratteri speciali: *, ? e []

proviamo nella nostra home directory a creare dei file vuoti con il comando touch:

[roberto@diamondhead roberto]$ touch doc1
[roberto@diamondhead roberto]$ touch doc2
[roberto@diamondhead roberto]$ touch documento
[roberto@diamondhead roberto]$ touch doc_s
[roberto@diamondhead roberto]$ touch miodoc
[roberto@diamondhead roberto]$ touch lunedi
[roberto@diamondhead roberto]$ touch martedi

per visualizzare tutti i file che iniziano con “doc” digitiamo:

[roberto@diamondhead roberto]$ ls doc*

Il carattere “*” serve appunto per espandere nomi di file con 0 o più caratteri. Se si vuole visualizzare tutti i file che iniziano con doc e che sono preceduti da un solo carattere si usa il “?”:

[roberto@diamondhead roberto]$ ls doc?

Bisogna prestare attenzione quando si usano questi caratteri speciali, soprattutto quando si usano con comandi come rm (remove):

[roberto@diamondhead roberto]$ rm doc*

se non è attivata la modalità interattiva questo comando ci cancella nella directory corrente, senza conferme, tutti i file che iniziano con “doc”.
Per dovere di cronaca se ci scappa un:

[root@diamondhead roberto]$ rm -rf /

come amministratore di sistema (root), cancelleremo senza tanti complimenti l’intero sistema operativo. Ci resterebbe solo qualche directory dedicata al mantenimento dei processi in corso, ma il resto verrebbe cancellato senza possibilità di tornare indietro.

Ora cancelliamo i file che abbiamo appena creato:

[roberto@diamondhead roberto]$ rm lunedi
[roberto@diamondhead roberto]$ rm martedi
[roberto@diamondhead roberto]$ rm miodoc

e creiamo:

[roberto@diamondhead roberto]$ touch doc1
[roberto@diamondhead roberto]$ touch doc2
[roberto@diamondhead roberto]$ touch doc3
[roberto@diamondhead roberto]$ touch docA
[roberto@diamondhead roberto]$ touch docB
[roberto@diamondhead roberto]$ touch docC
[roberto@diamondhead roberto]$ touch documento
[roberto@diamondhead roberto]$ touch documentoA

se vogliamo visualizzare tutti i file che iniziano con “doc” e come terzo carattere l'”1″ o il carattere “A” digiteremo:

[roberto@diamondhead roberto]$ ls doc[1A]
doc1 docA

per visualizzare tutti i file che terminano con “1” o con “A”:

[roberto@diamondhead roberto]$ ls doc*[1A]
doc1 docA documentoA

se vogliamo includere un range utilizzeremo all’interno delle parentesi quadre un trattino:

[roberto@diamondhead roberto]$ ls doc[1-C]
doc1 doc2 doc3 docA docB docC

Abbiamo poi un’altro operatore, che non si può definire di espansione dei file, che è la parentesi graffa. La parentesi graffa è spesso utile per generare nomi utilizzabili per creare o modificare file e directory. Per esempio, vogliamo creare tre directory e sappiamo che tutte iniziano con “doc”:

[roberto@diamondhead roberto]$ mkdir doc{umentoB,finale,bozza}

questi particolari che ho appena spiegato possono sembrare a prima vista delle sciocchezze. In realtà se in un futuro vi capiterà di amministrare un sistema linux sarete presi molto spesso con la creazione di script shell che dovranno svolgere determinati compiti. Con queste “dritte” sarete in grado di scrivere codice più compatto e più adatto ad una futura manutenzione.

Leave a Reply