Capitolo 27. Uso della shell

Sommario

27.1. Uso della shell bash sulla riga di comando
27.2. Utenti e autorizzazioni di accesso
27.3. Comandi Linux importanti
27.4. L'editor vi

Estratto

Anche se le interfacce utente grafiche stanno acquistando maggiore importanza per Linux, il mouse non è sempre il metodo migliore per eseguire task ricorrenti. Mediante la riga di comando, è possibile ottenere efficienza e flessibilità elevate. Le applicazioni basate sul testo sono particolarmente importanti per il controllo di computer su collegamenti di rete lenti, oppure se si desidera eseguire attività come root sulla riga di comando in xterm. La shell Bash è l'interprete di riga di comando di default in SUSE Linux.

Linux è un sistema multiutente; l'accesso ai file è controllato mediante autorizzazioni. Che si usi la riga di comando o un'interfaccia utente grafica, è utile comprendere il concetto delle autorizzazioni. Nell'utilizzo della riga di comando, sono importanti una serie di comandi. L'editor di testo vi viene spesso utilizzato nella configurazione di un sistema dalla riga di comando. È anche apprezzato da molti amministratori di sistema e sviluppatori.

27.1. Uso della shell bash sulla riga di comando

Nella barra dei task KDE è presente un'icona che raffigura un monitor con una conchiglia. Quando si clicca su questa icona, si apre la finestra di un terminale, nella quale inserire i comandi. Konsole, il programma del terminale, di solito esegue Bash (Bourne again shell), un programma sviluppato come parte del progetto GNU. Sul desktop di GNOME, per avviare un terminale che normalmente esegue Bash, fare clic sull'icona con il monitor di un computer nel riquadro superiore.

Una volta aperta la shell, osservare il prompt sulla prima riga. Di solito il prompt comprende il nome utente, il nome host e il percorso corrente, ma può essere personalizzato. Quando il cursore si trova dopo questo prompt, è possibile inviare comandi direttamente al proprio sistema informatico.

27.1.1. Immissione dei comandi

Un comando è composto da vari elementi. Il primo elemento è sempre il comando effettivo, seguito da parametri od opzioni. I comandi vengono eseguiti premendo Invio. Prima di effettuare questa operazione, modificare la riga di comando, aggiungere opzioni o correggere errori di battitura. Uno dei comandi utilizzati con maggiore frequenza è ls, che può essere utilizzato con o senza argomenti. Immettendo semplicemente ls il comando mostra i contenuti della directory corrente.

Le opzioni sono precedute da un trattino. Il comando ls -l , ad esempio, mostra i contenuti della stessa directory in modo dettagliato (formato listato lungo). Di fianco a ciascun nome di file, appare la data in cui è stato creato il file, la dimensione in byte e ulteriori dettagli descritti in seguito. Un'opzione importante che esiste per molti comandi è --help. Immettendo ls --help , appaiono tutte le opzioni per il comando ls.

È importante scrivere la «citazione» nel modo giusto. Se il nome di un file contiene uno spazio, sostituirlo utilizzando una barra inversa(\) 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.

27.1.2. File e directory

Per utilizzare la shell in modo efficace, è molto utile conoscere le strutture dei file e delle directory 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.

La directory /home contiene le directory nelle quali i singoli utenti possono salvare i loro file personali. Figura 27.1, «Estratto da un albero delle directory standard» mostra l'albero delle directory standard di Linux con le home directory degli utenti di esempio xyz, linux, e tux. L'albero delle directory di un sistema Linux ha una struttura funzionale che segue ilFilesystem Hierarchy Standard (FHS). La lista qui di seguito riporta una breve descrizione delle directory standard presenti in Linux.

Figura 27.1. 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)

27.1.3. Caratteristiche di Bash

Esistono due caratteristiche importanti della shell che possono facilitare di molto il lavoro:

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 . 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.

Completamento

Completare un nome di file in tutta la sua lunghezza dopo aver digitato le prime lettere fino a quando non viene individualmente identificato. Per eseguire questa operazione, digitare le prime lettere, quindi premere Tab. Se esistono diversi nomi di file che iniziano con le stesse lettere, è possibile ottenere una lista premendo due volte Tab.

27.1.3.1. Primo esempio: Gestione di file

Ora che gli utenti sanno come è un comando, quali directory esistono in SUSE Linux e come accelerare le cose quando si utilizza Bash, è importante mettere in pratica queste conoscenze con un piccolo esercizio.

  1. Aprire una console dal desktop KDE o GNOME cliccando sull'icona della shell.

  2. Immettere il comandols per vedere i contenuti della propria home directory.

  3. Utilizzare il comando mkdir (che corrisponde acrea directory ) per creare una nuova sottodirectory chiamata prova immettendo mkdir test.

  4. Ora lanciare un editor premendoAlt-F2 e immettendokate Kate per KDE gedit per Gedit in GNOME. Digitare alcune lettere nell'editor, quindi salvare il file come File di prova nella propria directory. Linux distingue tra maiuscole e minuscole. Per questo esempio, utilizzare una F maiuscola.

  5. Visualizzare di nuovo i contenuti della propria home directory. Anzichè digitare di nuovo ls premere semplicemente due volte; il comando ls dovrebbe riapparire al prompt. Per eseguire il comando, premere Invio. La directory prova appena creata dovrebbe apparire con lettere in azzurro e File di prova in nero. Questo esercizio dimostra come si possono distinguere directory e file in una console.

  6. Spostare File di provanella sottodirectory prova con il comando mv. Per accelerare l'operazione, utilizzare la funzione di espansione: immettere semplicemente mv F e premereTab. Fino a quando, all'interno della directory, non ci sono altri file che iniziano con questa lettera, la shell espande il nome del file e aggiunge la stringa estfile. Altrimenti aggiungere una lettera o due e provare con Tab ogni volta per vedere se la shell è in grado di espandere il nome. Infine, digitare uno spazio quindi prova dopo il nome del file esteso e premere Invio per eseguire il comando.

  7. A questo puntoFile di prova non dovrebbe essere più nella directory. Verificarlo immettendo di nuovo ls.

  8. Per vedere se lo spostamento del file ha avuto esito positivo, modificare la directory prova con il comandocd test. Ora immettere di nuovo ls. Nel listato dovrebbe apparire File di prova. Tornare di nuovo nella propria home directory in qualsiasi punto immettendo solo cd.

  9. Per fare una copia del file, utilizzare cp. Ad esempio, immetterecp File di prova Provabackup per copiare File di prova in Provabackup. Ancora una volta, è possibile utilizzare il comando ls per veder se entrambi i file sono nella directory.

27.1.4. Indicazione dei percorsi

Quando si lavora con i file o con le directory, è importante indicare il percorso corretto. Non è comunque necessario immettere l'intero percorso (assoluto) dalla directory root al rispettivo file. È possibile iniziare dalla directory corrente. Indirizzare la propria home directory direttamente con ~. Questo significa che esistono due modi per elencare il fileFile di provanella directory prova: immettendo il percorso relativo con ls prova o specificando il percorso assoluto con ls ~/prova.

Per ottenere una lista dei contenuti delle home directory degli altri utenti, immettere ls ~username. Nell'albero della directory di esempio, uno degli utenti campione è tux. In questo caso, ls ~tux dovrebbe elencare i contenuti della home directory di tux.

Rappresentare la directory corrente con un punto (.). Nell'albero, il livello successivo più elevato è rappresentato da due punti (..). Immettendo ls .., è possibile vedere i contenuti della directory superiore della directory corrente. Il comando ls ../..mostra i contenuti della directory di due livelli superiori nella gerarchia.

27.1.4.1. Secondo esempio: Lavorare con i percorsi

Qui di seguito è riportato un altro esempio che mostra come muoversi nelle directory del sistema SUSE Linux.

  1. Modificare la home directory con il comando cd. Quindi creare una directory all'interno di essa con il nome prova2 immettendo mkdir prova2.

  2. Modificare la nuova directory in cd prova2 e creare una sottodirectory all'interno di essa con il nomesottodirectory. Per modificarla, utilizzare la funzione espansione: immettere cd suquindi premereTab. La shell espande il resto del nome della directory.

  3. Ora, cercare di spostare il file precedentemente creato Provabackup nella directory corrente (sottodirectory) senza modificare di nuovo la directory. Per effettuare questa operazione, indicare il percorso relativo a quel file: mv ../../test/Testbackup . (notare il punto alla fine). Il punto alla fine di questo comando è necessario per dire alla shell che la directory corrente è la destinazione nella quale spostare il file. ../../, in questo esempio, si riferisce alla propria home directory.

27.1.5. Caratteri jolly

Un'altra comodità offerta dalla shell sono i caratteri jolly per l'espansione del nome del percorso. 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 ancheFile di prova. ls *fil* mostra tutti i file campione. Infine è possibile utilizzare il carattere jollyset 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.

27.1.6. Less e More

Linux comprende due programmini per visualizzare i file di testo direttamente nella shell. 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 Sezione 27.1.7, «Pipe e reindirizzamento».

27.1.7. Pipe e reindirizzamento

Di solito, l'output standard nella shella è lo schermo o la finestra della console e l'input standard è la tastiera. Per inoltrare l'output di un comando a un'applicazione come less, utilizzare una pipeline.

Per visualizzare i file nella directory test, immettere il comandols test | less. I contenuti della directory test vengono quindi visualizzati con 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.

È anhe possibile salvare l'output dei comandi in un file. Ad esempio, echo "test one" > Content genera un nuovo file chiamato Content contenente le paroletest one. Visualizzare il file con less Content.

È anche possibile utilizzare un file come input per un comando. Ad esempio, con tr sostituire i caratteri dall'input standard reindirizzati dal file Content e scrivere il risultato nell'output standard: sostituire t con xchiamandotr t x < Content. L'output ditrviene inviato allo schermo.

Se è necessario un nuovo file contenente l'output, collegare a cascata l'output ditr a un file. Per provare questa operazione, modificare test e immettere il comando tr t x < ../Content > new. Infine visualizzare new con less new.

Allo stesso modo dell'output standard, l'output di errore standard viene inviato alla console. In ogni caso, 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. Infine, per aggiungere l'output di un comando a un file già esistente, il comando deve essere seguito da >> anzichè>.

27.1.8. 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 directorytest, 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 filetestarchive.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 comandogunzip. Immettere gunzip testarchive.tar.gz, che darà il file testarchive.tar, che dovrà 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.

27.1.9. mtools

Glimtools sono un set di comandi per lavorare con i file system MS-DOS. I comandi inclusi inmtools consentono di indirizzare la prima unità floppy come a:, analogamente a MS-DOS e i comandi sono gli stessi di MS-DOS con la sola eccezione che sono preceduti dal prefisso m.

mdir a:

Visualizza i contenuti del disco floppy nell'unità a:

mcopy Testfile a:

Copia il file Testfile sul disco floppy

mdel a:Testfile

Cancella Testfile in a:

mformat a:

Formatta il disco floppy in formato in MS-DOS (con il comandofdformat)

mcd a:

Trasforma a: in directory corrente

mmd a:test

Crea ka sottodirectory test sul disco floppy

mrd a:test

Cancella la sottodirectory test dal disco floppy

27.1.10. 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. In Sezione 27.3, «Comandi Linux importanti», si trova una lista dei comandi più importanti e una breve descrizione delle loro funzioni.