Capitolo 3. Uso della shell

Sommario

3.1. Introduzione alla shell Bash
3.2. Utenti e autorizzazioni di accesso
3.3. Comandi Linux importanti
3.4. L'editor vi

Estratto

All'avvio del sistema Linux, viene visualizzata direttamente un interfaccia grafica che guida l'utente attraverso il processo di login e le seguenti interazioni con il sistema. Nonostante questo tipo di interfacce siano diventate molto importanti e di facile utilizzo, non rappresentano l'unico modo per comunicare con il sistema. È possibile anche utilizzare una comunicazione orientata al testo come un interprete di riga di comando, chiamato di solito shell, in cui è possibile inserire i vari comandi. Dal momento che Linux dispone di opzioni per avviare le finestre di shell dall'interfaccia grafica, è possibile utilizzare in maniera facile entrambi i metodi.

Per l'amministrazione, le applicazioni basate su shell sono particolarmente importanti per il controllo di computer su collegamenti di rete lenti, oppure se si desidera eseguire da riga di comando attività in qualità di utente root. Per i "principianti" di Linux, potrebbe essere abbastanza insolito inserire comandi in una shell, ma altrettanto facilmente capiranno che la shell non è solo per gli amministratori di sistema. Infatti, la shell rappresenta spesso la maniera più veloce e facile di eseguire attività giornaliere.

Esistono diverse shell per UNIX o Linux. La shell predefinita di SUSE è Bash (GNU Bourne-Again Shell).

Questo capitolo descrive alcune informazioni di base che è necessario conoscere per l'utilizzo della shell. Tra gli altri, verranno trattati i seguenti argomenti: come inserire comandi, la struttura delle directory di Linux, il lavoro con file e directory e l'utilizzo di alcune funzioni di base, il concetto di utente e autorizzazioni di Linux, una panoramica di importanti comandi di shell e una breve introduzione all'editor vi, che è l'editor predefinito nei sistemi Unix e Linux.


3.1. Introduzione alla shell Bash

In Linux, è possibile utilizzare la riga di comando parallelamente all'interfaccia grafica utente e passare facilmente da una all'altra. Per avviare una finestra di terminale dall'interfaccia grafica utente in KDE, fare clic sull'icona di Konsole nel pannello. In GNOME, fare clic sull'icona di GNOME Terminal nel pannello.

Viene aperta la finestra dei programmi Konsole o GNOME Terminal, visualizzando il prompt della prima riga come illustrato nella Figura 3.1, "Esempio di una finestra di terminale bash". Il prompt visualizza solitamente il nome del login (in questo esempio, tux), il nome host del computer (qui, knox), e il percorso corrente (in questo caso, la home directory, indicata dal simbolo tilde, ~). Quando si effettua il login su un computer remoto queste informazioni indicano sempre il sistema su cui si sta attualmente lavorando. Quando il cursore si trova dopo questo prompt, è possibile inviare comandi direttamente al proprio sistema informatico.

Figura 3.1. Esempio di una finestra di terminale bash

Esempio di una finestra di terminale bash

3.1.1. Immissione dei comandi

Un comando è composto da vari elementi. Il primo elemento è sempre il comando effettivo, seguito da parametri od opzioni. È possibile digitare un comando e modificarlo, utilizzando , , <—, Canc e Space. È possibile anche aggiungere opzioni o correggere errori di battitura. Il comando viene eseguito premendo Enter.

[Important]Nessuna nuova, buone nuove

La shell non è un'applicazione di tipo verbose: al contrario di alcune interfacce grafiche utente, non fornisce solitamente messaggi di conferma quando i comandi sono stati eseguiti. I messaggi vengono visualizzati solo in caso di problemi o errori.

È importante ricordare questa caratteristica soprattutto in caso di eliminazione di oggetti. Prima di inserire un comando come rm per la rimozione di un file, è necessario essere sicuri di volere effettuare la cancellazione dell'oggetto: perché verrà eliminato in maniera definitiva e senza messaggi di conferma.

3.1.1.1. Utilizzo di comandi senza opzioni

È possibile visualizzare la struttura di comandi utilizzando un semplice esempio: il comando ls, utilizzato per elencare il contenuto di una directory. Il comando può essere utilizzato con o senza opzioni. Immettendo semplicemente ls il comando mostra i contenuti della directory corrente.

Figura 3.2. Il comando ls

Il comando ls

Al contrario di quanto accade in MS Windows, in Linux i file possono, ma non necessariamente devono, avere un'estensione, ad esempio .txt. In questo modo è difficile differenziare tra file e cartelle, come succede in questo output del comando ls. Di default, i colori possono venire in aiuto dell'utente: le directory sono solitamente visualizzate in blu, mentre i file in nero.

3.1.1.2. Utilizzo di comandi con opzioni

Un modo migliore di ottenere più dettagli sul contenuto di una directory è tramite il comando ls con una stringa di opzioni. Le opzioni modificano il modo di funzionamento di un comando in maniera tale da poter compiere operazioni specifiche. Le opzioni sono separate dal comando da uno spazio e sono prefissate da un trattino. Il comando ls -l mostra i contenuti della stessa directory in modo dettagliato (formato listato lungo).

Figura 3.3. Il comando ls -l

Il comando ls -l

A sinistra di ciascun nome di oggetto, vengono visualizzate su diverse colonne informazioni relative all'oggetto stesso. I più importanti sono i seguenti: La prima colonna mostra il tipo di file dell'oggetto (in questo esempio, d per directory oppure - per i file normali). Le successive nove colonne mostrano le autorizzazioni dell'utente relative all'oggetto. Le colonne 11 e 12 mostrano il nome del proprietario del file e il gruppo (in questo caso, tux users). Per ulteriori informazioni sulle autorizzazioni e sul concetto di utente di Linux, vedere la Sezione 3.2, "Utenti e autorizzazioni di accesso". La colonna successiva mostra la dimensione del file in byte. Infine, vengono visualizzate data e ora dell'ultima modifica. L'ultima colonna mostra il nome dell'oggetto.

Se si desidera visualizzare ancora più informazioni, è possibile combinare due opzioni per il comando ls ed inserire ls -la. La shell mostra anche file nascosti nella directory, preceduti da un punto (ad esempio, .filenascosto).

3.1.1.3. Informazioni della guida

Nessun utente può conoscere a memoria tutte le opzioni di tutti i comandi. Se si ricorda il nome del comando, ma non si è sicuri delle opzioni, è possibile inserire il comando seguito da uno spazio e da --help. L'opzione --help è disponibile per molti comandi. Immettendo ls --help appaiono tutte le opzioni per il comando ls.

3.1.2. La struttura delle directory di Linux

Poiché la shell non offre una panoramica grafica di directory e file come la struttura ad albero in un file manager, è utile avere alcune conoscenze di base della struttura delle directory predefinita di un sistema Linux. Si può pensare alle directory come a cartelle elettroniche nelle quali sono memorizzati file, programmi e sottodirectory. La directory di massimo livello nella gerarchia è la directory root menzionata come /. Da questa posizione è possibile accedere a tutte le altre directory.

Nella Figura 3.4, "Estratto da un albero delle directory standard" viene mostrato l'albero di directory standard di Linux, con le home directory degli utenti di esempio xyz, linux e tux. La directory /home contiene le directory in cui i singoli utenti possono memorizzare i file personali.

[Note]Home directory in un ambiente di rete

Se si opera in un ambiente di rete, la home directory potrebbe non essere denominata /home. Può essere mappata a qualsiasi directory nel file system.

La lista qui di seguito riporta una breve descrizione delle directory standard presenti in Linux.

Figura 3.4. Estratto da un albero delle directory standard

Estratto da un albero delle directory standard
/

Directory root, punto di inizio dell'albero delle directory

/home

Directory personali degli utenti

/dev

File dei dispositivi che rappresentano i componenti hardware

/etc

File importanti per la configurazione del sistema

/etc/init.d

Script di avvio

/usr/bin

Programmi generalmente accessibili

/bin

Programmi richiesti per primi nel processo di avvio

/usr/sbin

Programmi riservati all'amministratore del sistema

/sbin

Programmi riservati all'amministratore del sistema e necessari per l'avvio

/usr/include

File di intestazione per il compilatore C

/usr/include/g++

File di intestazione per il compilatore C++

/usr/share/doc

File relativi a documentazione varia

/usr/share/man

System manual pages (pagine man)

/usr/src

Codice sorgente del software di sistema

/usr/src/linux

Codice sorgente del kernel

/tmp, /var/tmp

File temporanei

/usr

Tutti i programmi delle applicazioni

/var

File di configurazione (ad esempio quelli collegati da /usr)

/var/log

File log di sistema

/var/adm

Dati relativi all'amministrazione del sistema

/lib

Librerie condivise (per i programmi collegati in modo dinamico)

/proc

File system di processo

/sys

File system di sistema nel quale sono riunite tutte le informazioni del dispositivo per il kernel

/usr/local

Estensioni locali indipendenti dalla distribuzione

/opt

Software facoltativo, pacchetti di programmi aggiuntivi di dimensioni maggiori (come KDE, GNOME, Netscape)

3.1.3. Lavorare con directory e file

Per individuare un file o una cartella determinati, occorre specificare il percorso che vi conduce. Vi sono due modi per specificare un percorso:

  • Il percorso completo (assoluto) dalla directory root al file rispettivo

  • Un percorso che parte dalla directory corrente (percorso relativo)

I percorsi assoluti cominciano sempre con una barra. I percorsi relativi non cominciano con una barra.

[Note]Linux distingue tra caratteri maiuscoli e minuscoli

Il file system di Linux fa distinzione tra caratteri maiuscoli e minuscoli. Ad esempio, i file test.txt e Test.txt in Linux sono due file diversi. Ricordarsi di questa caratteristica quando si digitano nome di file o percorsi.

Per modificare le directory, utilizzare il comando cd. Inserire la directory come opzione del comando. Rappresentare la directory corrente con un punto (.). Nell'albero, il livello successivo più elevato è rappresentato da due punti (..). Per passare alla directory superiore alla directory corrente, digitare cd ... Non dimenticare di inserire uno spazio dopo il comando cd per separarlo dalle opzioni. Il prompt ora mostra il percorso alla directory di livello superiore rispetto a quella in cui è stato eseguito il comando. Per passare a una directory superiore di due livelli rispetto a quella corrente, digitare cd ../... ls -l ../.. elenca il contenuto della directory superiore di due livelli

3.1.3.1. Esempi di individuazione di un file

I comandi cd presenti nella Sezione 3.1.3, "Lavorare con directory e file" utilizzano percorsi relativi. È possibile utilizzare anche percorsi assoluti. Ad esempio, si desidera copiare un file da una home directory a una sottodirectory di /tmp:

  1. In primo luogo, dalla home directory creare una sottodirectory in /tmp:

    1. Se la directory corrente non è la home directory, digitare cd ~ per passare ad essa. Da qualsiasi punto nel file system, è possibile raggiungere la home directory digitando cd ~.

    2. Nella home directory, digitare mkdir /tmp/test. mkdir significa "make directory" (crea directory). Questo comando crea una nuova directory denominata test nella directory /tmp. In questo caso, è necessario utilizzare un percorso assoluto per creare la directory.

    3. Per verificare che cosa è accaduto, digitare ls -l /tmp. La nuova directory test viene visualizzata nel contenuto della directory /tmp.

  2. Adesso creare un nuovo file nella home directory e copiarlo nella directory /tmp/test utilizzando un percorso relativo.

    1. Digitare touch myfile.txt. Il comando touch con l'opzione myfile.txt crea un nuovo file vuoto denominato myfile.txt nella directory corrente.

    2. Verificare l'operazione digitando ls -l. Il nuovo file viene visualizzato nel contenuto della directory.

    3. Digitare cp myfile.txt ../tmp/test. Questo comando copia il file myfile.txt nella directory /tmp/test senza modificare il nome del file.

    4. Verificare l'operazione digitando ls -l /tmp/test. Il file myfile.txt viene visualizzato nel contenuto della directory /tmp/test.

Per ottenere un elenco del contenuto delle home directory di altri utenti, digitare ls ~nome utente. Nella directory di esempio illustrata nella Figura 3.4, "Estratto da un albero delle directory standard", uno degli utenti è tux. In questo caso, ls ~tux dovrebbe elencare i contenuti della home directory di tux.

[Note]Gestione degli spazi nei nomi di file o di directory

Se il nome di un file contiene uno spazio, sostituirlo utilizzando una barra inversa(\) davanti allo spazio o racchiuderlo tra virgolette semplici o doppie. In caso contrario Bash interpreta il nome di un file come I miei documenti come il nome di tre file o directory. La differenza tra le virgolette singole e quelle doppie è che l'espansione della variabile avviene con le virgolette doppie. Le virgolette semplici garantiscono che la shell veda la stringa tra virgolette alla lettera.

3.1.4. Funzioni utili della shell

L'inserimento di comandi in Bash può comportare molta digitazione. Nelle sezioni seguenti, verranno descritte molte funzioni di Bash in grado di facilitare molto il lavoro e ridurre la digitazione.

3.1.4.1. Cronologia e completamento

Di default, Bash "ricorda" i comandi digitati. Questa caratteristica è denominata cronologia. Per ripetere un comando precedentemente inserito, premere fino a quando non appare il comando al prompt. Spostarsi avanti nella lista dei comandi precedentemente inseriti premendo . È sempre possibile modificare questo comando, ad esempio, modificare il nome di un file prima di eseguire il comando premendo Enter. Per modificare la riga di comando, spostare il cursore nella posizione desiderata utilizzando i tasti con le frecce e iniziare la digitazione. Per effettuare una ricerca nella cronologia utilizzare Ctrl-R.

Il completamento di un nome di file o di directory dopo la digitazione delle prime lettere è un'altra utile funzione di Bash. Per eseguire questa operazione, digitare le prime lettere, quindi premere →|. Se il nome di file o il percorso possono essere identificati in maniera univoca, il completamento avviene immediatamente e il cursore si sposta alla fine del nome del file. È possibile digitare eventualmente l'opzione successiva del comando. Se il nome di file o il percorso non sono identificati in maniera univoca (poiché esistono diversi nomi che iniziano con le stesse lettere), vengono completati solo fino al punto in cui sono possibili nuovamente altre opzioni. È possibile ottenere un elenco di questi nomi, premendo nuovamente →|. Successivamente, è possibile digitare le lettere successive del file o del percorso, quindi ritentare il completamento premendo →|. Nel completamento di nomi di file o di percorsi con l'aiuto di →| è possibile verificare simultaneamente se il file o il percorso che si desidera digitare esiste realmente (assicurandosi in questo modo della corretta ortografia).

3.1.4.2. Caratteri jolly

Un'altra comodità offerta dalla shell sono i caratteri jolly per l'espansione del nome del percorso. I caratteri jolly sostituiscono altri caratteri. In Bash ne esistono di tre tipi diversi:

?

Esatta corrispondenza con un carattere arbitrario

*

Corrispondenza con qualsiasi numero di caratteri

[set]

Corrisponde a uno dei caratteri dal gruppo indicato tra parentesi quadre, che è rappresentato dalla stringa set. Come parte diset è anche possibile indicare le classi di carattere utilizzando la sintassi[:classe:], dove una classe è alnum, alpha, ascii e così via.

L'utilizzo di ! o ^ all'inizio del gruppo ([!set]) corrisponde a un carattere diverso da quelli identificati da set.

Supponendo che la directory prova contenga i file File di prova, File di prova1, File di prova2 e datafile, il comando ls File di prova? elenca i file File di prova1 e File di prova2. Con ls Prova*, la lista comprende anche File di prova. ls *fil* mostra tutti i file campione. Infine è possibile utilizzare il carattere jolly set per indicare tutti i file campione aventi un numero come ultimo carattere. ls File di prova[1-9] o uso di classi, ls File di prova[[:digit:]].

Dei quattro tipi di caratteri jolly, il più inclusivo è l'asterisco. Può essere utilizzato per copiare tutti i file contenuti in una directory in un'altra o per cancellare tutti i file con un comando. Il comando rm *fil*, ad esempio, cancellerebbe tutti i file nella directory corrente il cui nome comprenda la stringa fil.

3.1.4.3. Visualizzazione di file con Less e More

Linux include due programmini per visualizzare i file di testo direttamente nella shell. less e more. Anzichè avviare un editor per leggere un file come Readme.txt, immettere semplicemente less Readme.txt per visualizzare il testo nella finestra della console. Utilizzare lo Spazio per scorrere la pagina verso il basso. Utilizzare i tasti Pagina su e Pagina giù per spostarsi all'interno del testo. Per uscire da less, premere Q.

Al posto di less, è possibile utilizzare il programma più vecchio more. Comunque, non è così comodo perchè non consente di scorrere la pagina verso il basso.

Il programma less ha preso il nome dalla massima meno è di più e può anche essere utilizzato per visualizzare in modo comodo l'output dei comandi. Per informazioni sul suo funzionamento, leggere la Sezione 3.1.4.4, "Reindirizzamento e pipe".

3.1.4.4. Reindirizzamento e pipe

Di solito, l'output standard nella shell è lo schermo o la finestra della console e l'input standard è la tastiera. Tuttavia, la shell offre funzioni con cui ridirigere l'input e l'output verso un altro oggetto, come un file o un altro comando. Con l'aiuto dei simboli > e <, ad esempio, è possibile inoltrare l'output di un comando verso un file (reindirizzamento dell'output) oppure utilizzare un file come input per un comando (reindirizzamento dell'input). Ad esempio, se si desidera scrivere l'output di un comando come ls su un file, digitare ls -l > file.txt. In questo modo, viene creato un file denominato file.txt che contiene l'elenco del contenuto della directory corrente, così come è generato dal comando ls. Tuttavia, se già esiste un file denominato file.txt, questo comando sovrascrive il file esistente. Per prevenire questa operazione, utilizzare >>. Digitando ls -l >> file.txt viene semplicemente aggiunto l'output del comando ls a un file già esistente denominato file.txt. Se invece il file non esiste, verrà creato.

Talvolta, è utile anche utilizzare un file come input per un comando. Ad esempio, con il comando tr, è possibile sostituire caratteri reindirizzati da un file e scrivere il risultato sull'output standard, lo schermo. Ad esempio, si desidera sostituire tutti i caratteri t del file file.txt dell'esempio precedente con x e visualizzare il risultato sullo schermo. Per eseguire questa operazione, digitare tr t x < file.txt.

Allo stesso modo dell'output standard, l'output di errore standard viene inviato alla console. Per reindirizzare l'output di errore standard a un file chiamato errors, aggiungere 2> errors al comando corrispondente. Sia l'output standard, sia l'errore standard vengono salvati in un file chiamato alloutput se si aggiunge >& alloutput.

Anche l'utilizzo di pipeline o pipe può essere definito una sorta di reindirizzamento, nonostante l'utilizzo di pipe non sia limitato ai file. Con una pipe (|), è possibile combinare diversi comandi, utilizzando l'output di un comando come input del comando successivo. Ad esempio, per visualizzare il contenuto della directory corrente in less, digitare ls | less. Questa operazione ha senso se l'output normale con ls fosse troppo lungo. Ad esempio, se si visualizzano i contenuti della directory dev con ls /dev, nella finestra se ne vede solo una piccola parte. Visualizzare l'intera lista con ls /dev | less.

3.1.5. Archivi e compressione dei dati

A questo punto che è già stato creato un certo numero di file e directory, vengono presi in considerazione gli argomenti relativi agli archivi e alla compressione dei dati. Supponendo che si voglia avere l'intera directory test in un file da salvare su uno stick USB come copia di backup o inviarlo per e-mail. Per eseguire questa operazione, utilizzare il comando tar (per tape archiver). Con tar --help, visualizzare tutte le opzioni per il comando tar. Qui di seguito è riportata la spiegazione delle opzioni più importanti:

-c

(come creare) Creare un nuovo archivio.

-t

(come tabella) Visualizzare i contenuti di un archivio.

-x

(come estrarre) Decomprimere l'archivio.

-v

(come prolisso) Mostra tutti i file a video durante la creazione dell'archivio.

-f

(come file) Scegliere un nome di file per il file dell'archivio. Durante la creazione di un archivio, questa opzione deve essere sempre data come ultima.

Per comprimere la directory test con tutti i suoi file e sottodirectory in un archivio chiamato testarchive.tar, utilizzare le opzioni -c e -f. Come prova, aggiungere anche -v per seguire l'avanzamento dell'archiviazione anche se questa opzione non è obbligatoria. Dopo aver utilizzato cd per modificare la propria home directory dove è posizionata la directory test, immettere tar -cvf testarchive.tar test. Dopo di che, visualizzare i contenuti del file dell'archivio con tar -tf testarchive.tar. La directory test con tutti i suoi file e directory sul disco rigido è rimasta invariata. Per decomprimere l'archivio, immettere tar -xvf testarchive.tar, ma attendere ancora.

Per la compressione dei file la scelta ovvia è gzip o, per un rapporto di compressione ancora migliore, bzip2. Immettere semplicemente gzip testarchive.tar (o bzip2 testarchive.tar, anche se in questo esempio è stato utilizzato gzip). Con ls, a questo punto si noterà che il file testarchive.tar non è più in questa posizione e che, invece, è stato creato il file testarchive.tar.gz. Questo file è molto più piccolo e quindi adatto al trasferimento via e-mail o all'archiviazione su uno stick USB.

Ora, decomprimere questo file nella directorytest2 creata in precedenza. Per eseguire questa operazione, immettere cp testarchive.tar.gz test2 per copiare il file in quella directory. Modificare la directory con cd test2. Ora è possibile decomprimere un file compresso con estensione .tar.gz con il comando gunzip. Digitare gunzip testarchive.tar.gz. Il comando origina il file testarchive.tar, che deve essere estratto o decompresso con tar -xvf testarchive.tar. È anche possibile decomprimere ed estrarre un archivio compresso in un solo passaggio con tar -xvf testarchive.tar.gz (non è più necessario aggiungere l'opzione-z). Con ls, è possibile vedere che è stata creata una nuova directory test con gli stessi contenuti della directory test presente nella home directory.

3.1.6. Ripulitura

Al termine di questo corso intensivo, l'utente dovrebbe essere a conoscenza delle nozioni fondamentali relative alla shell Linux o alla riga di comando. A questo punto è possibile ripulire la propria home directory cancellando i vari file di prova e le directory con i comandi rm e rmdir. Nella Sezione 3.3, "Comandi Linux importanti", si trova una lista dei comandi più importanti e una breve descrizione delle loro funzioni.