[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 31.   La shell

La shell è il mezzo attraverso cui si interagisce con il sistema. Il modo di inserire i comandi può cambiare molto da una shell all'altra. Gli esercizi proposti in questa sezione sono stati realizzati in particolare con la shell Bash, ma gran parte di questi possono essere validi anche per altre shell.

31.1   Completamento automatico con la shell Bash

Il completamento automatico è un modo attraverso cui la shell Bash aiuta l'utente a completare un comando. La richiesta di completamento viene fatta attraverso l'uso del tasto [Tab]. Si preparano alcuni file di esempio. I nomi utilizzati sono volutamente lunghi.

touch microinterruttore[Invio]

touch microscopico[Invio]

touch supersonico[Invio]

Supponendo di voler utilizzare questi nomi all'interno di una riga di comando, si può essere un po' infastiditi dalla loro lunghezza. Utilizzando il completamento automatico si risolve il problema.

ls sup[Tab]

Dopo avere scritto solo sup, premendo il tasto [Tab] si ottiene il completamento del nome, dal momento che non esistono altri file o directory (nella posizione corrente) che inizino nello stesso modo. L'esempio seguente mostra lo stesso comando completato e terminato.

ls sup[Tab]ersonico[Invio]

Il completamento automatico dei nomi potrebbe essere impossibile. Infatti, potrebbe non esistere alcun nome che coincida con la parte iniziale già inserita, oppure potrebbero esistere più nomi composti con lo stesso prefisso. In questo ultimo caso, il completamento si ferma al punto in cui i nomi iniziano a distinguersi.

ls mic[Tab]ro

In questo caso, il completamento si spinge fino a micro che è la parte comune dei nomi microinterruttore e microscopico. Per poter proseguire occorre aggiungere un'indicazione che permetta di distinguere tra i due nomi. Volendo selezionare il primo di questi nomi, basta aggiungere la lettera i e premere nuovamente il tasto [Tab]. L'esempio seguente rappresenta il procedimento completo.

ls mic[Tab]roi[Tab]nterruttore[Invio]

31.2   Sostituzione: caratteri jolly

L'utilizzo di caratteri jolly rappresenta una forma alternativa di completamento dei nomi. Infatti è compito della shell la trasformazione dei simboli utilizzati per questo scopo.

Per questo esercizio si utilizzano i file creati nella sezione precedente: microinterruttore, microscopico e supersonico. In seguito se ne vengono aggiunti altri quando l'esercizio lo richiede.

31.3   Sostituzione: asterisco

L'asterisco rappresenta una sequenza indefinita di zero o più caratteri di qualunque tipo, esclusa la barra obliqua di separazione tra le directory. Per cui, l'asterisco utilizzato da solo rappresenta tutti i nomi di file disponibili nella directory corrente.

ls[Invio]

Il comando ls appena mostrato serve a elencare tutti i nomi di file e directory contenuti nella directory corrente.

ls *[Invio]

Questo comando è un po' diverso, nel senso che la shell provvede a sostituire l'asterisco con tutto l'elenco di nomi di file e directory contenuti nella directory corrente. Sarebbe come se il comando fosse ls microinterruttore microscopico...

In tal senso, anche il comportamento di ls cambia: non si limita a elencare il contenuto della directory corrente, ma (eventualmente, se ce ne sono) anche quello di tutte le directory contenute in quella corrente.

L'asterisco può essere utilizzato anche assieme a parti fisse di testo.

ls micro*[Invio]

Questo comando è composto in modo che la shell sostituisca micro* con tutti i nomi che iniziano per micro.

microinterruttore microscopico

È stato precisato che l'asterisco può essere sostituito anche con la stringa nulla. Per verificarlo si crea un altro file.

touch nanomicro[Invio]

Con il comando seguente si vogliono elencare tutti i nomi che contengono la parola micro.

ls *micro*[Invio]

microinterruttore microscopico nanomicro

31.4   Sostituzione: interrogativo

Il punto interrogativo rappresenta esattamente un carattere qualsiasi.

Prima di proseguire si aggiungono alcuni file con nomi adatti agli esempi seguenti.

touch xy123j4[Invio]

touch xy456j5[Invio]

touch xy789j111[Invio]

touch xy78j67[Invio]

Con il comando seguente si vuole intervenire su tutti i file lunghi esattamente sette caratteri che contengono la lettera j nella sesta posizione.

ls ?????j?[Invio]

xy123j4 xy456j5

Diverso sarebbe stato usando l'asterisco: non si può limitare il risultato ai file che contengono la lettera j nella sesta posizione, ma nemmeno la lunghezza del nome può essere presa in considerazione.

ls *j*[Invio]

In questo modo si ottiene l'elenco di tutti i nomi che contengono la lettera j, senza specificare altro.

xy123j4 xy456j5 xy789j111 xy78j67

31.5   Sostituzione: parentesi quadre

Le parentesi quadre vengono utilizzate per delimitare un elenco o un intervallo di caratteri. Rappresentano un solo carattere tra quelli contenuti, o tra quelli appartenenti all'intervallo indicato.

ls xy????[4567]*[Invio]

xy123j4 xy456j5 xy78j67

Il comando appena indicato è stato scritto in modo da fornire a ls, come argomento, l'elenco di tutti i file i cui nomi iniziano per xy, proseguono con quattro caratteri qualunque, quindi contengono un carattere da 4 a 7 e terminano in qualunque modo. Lo stesso risultato si potrebbe ottenere indicando un intervallo nelle parentesi quadre.

ls xy????[4-7]*[Invio]

31.6   Protezione

Il fatto che la shell sostituisca alcuni caratteri complica il loro utilizzo nei nomi di file e directory. Se esiste la necessità, è possibile evitare la sostituzione di questi caratteri facendoli precedere da una barra obliqua inversa, che funge da carattere di escape, ovvero, da simbolo di protezione.

touch sei\*otto[Invio]

ls[Invio]

...
sei*otto

In questo modo è possibile includere nel nome di un file anche lo spazio.

touch sei\ bella[Invio]

ls[Invio]

...
sei bella
sei*otto

È possibile ottenere un risultato simile delimitando il testo che deve essere interpretato come un oggetto unico attraverso apici singoli o apici doppi:

touch "sei*sei"[Invio]

touch 'tre*due'[Invio]

ls[Invio]

...
tre*due
...
sei bella
sei*otto
sei*sei

touch "sei alta"[Invio]

ls[Invio]

...
tre*due
...
sei alta
sei bella
sei*otto
sei*sei

È bene ricordare che l'uso degli apici singoli o degli apici doppi non è sempre equivalente, ma questo e altri dettagli vengono approfonditi nella parte dedicata alla shell POSIX (parte xxv).

31.7   Verifica della sostituzione

L'uso di caratteri jolly può essere pericoloso quando non si ha un'esperienza sufficiente a determinare l'effetto esatto del comando che ci si accinge a utilizzare. Ciò soprattutto quando si utilizzano per cancellare. Il modo migliore per verificare l'effetto della sostituzione dei caratteri jolly è l'uso del comando echo, che si occupa semplicemente di visualizzare l'elenco dei suoi argomenti.

Per esempio, per sapere quali file e directory vengono coinvolti dal modello micro*, basta il comando seguente:

echo micro*[Invio]

microinterruttore microscopico

Anche l'uso di ls, come comando non distruttivo, può essere di aiuto per determinare l'estensione di un modello fatto di caratteri jolly. Ma ls mostra anche il contenuto delle directory che vengono indicate tra gli argomenti, quindi potrebbe distrarre un po' l'utilizzatore.

31.8   Ridirezione

La ridirezione dirotta i dati in modo da destinarli a un file o da prelevarli da un file.

ls -l > elenco[Invio]

Questo comando genera il file elenco con il risultato dell'esecuzione di ls. Si può controllare il contenuto di questo file con cat.

cat elenco[Invio]

Anche l'input può essere ridiretto, quando il comando al quale si vuole inviare è in grado di riceverlo. Il comando cat è in grado di emettere ciò che riceve dallo standard input.

cat < elenco[Invio]

Si ottiene in questo modo la visualizzazione del contenuto del file elenco, esattamente come succede con il comando precedente, ma in tal caso, il file da visualizzare viene ottenuto dallo standard input per mezzo dell'attività della shell.

La ridirezione dell'output, come è stata vista finora, genera un nuovo file ogni volta, eventualmente sovrascrivendo ciò che esiste già con lo stesso nome. Sotto questo aspetto, la ridirezione dell'output è fonte di possibili danni.

La ridirezione dell'output può essere fatta in aggiunta, creando un file se non esiste, o aggiungendovi i dati se invece esiste già.

ls -l /tmp >> elenco[Invio]

In tal modo viene aggiunto al file elenco l'elenco dettagliato del contenuto della directory /tmp/.

cat elenco[Invio]

31.9   Condotti

Il condotto, ovvero la pipeline, è una forma di ridirezione in cui la shell invia l'output di un comando come input del successivo.

cat elenco | sort[Invio]

In questo modo, cat legge il contenuto del file elenco, ma questo, invece di essere visualizzato sullo schermo, viene inviato dalla shell come standard input di sort che lo riordina e poi lo emette sullo schermo.

Un condotto può utilizzare anche la ridirezione, per cui, il comando visto precedentemente può essere trasformato nel modo seguente:

cat < elenco | sort[Invio]

Naturalmente, il comando si può semplificare come indicato sotto, ma in tal caso non si tratta più di condotto:

sort < elenco[Invio]

31.10   Alias

La creazione di un alias è un metodo che permette di definire un nome alternativo per un comando preesistente.

alias elenca='ls -l'[Invio]

Dopo aver definito l'alias elenca, come indicato nel comando precedente, utilizzandolo si ottiene l'equivalente di ls -l. Basta provare.

elenca[Invio]

Ma l'alias permette di utilizzare argomenti, come se si trattasse di comandi normali.

elenca micro*[Invio]

Quello che si ottiene corrisponde al risultato del comando ls -l micro*:

-rw-rw-r--   1 tizio    tizio           0 Dec 26 10:19 microinterruttore
-rw-rw-r--   1 tizio    tizio           0 Dec 26 10:19 microscopico

Gli alias tipici che vengono creati sono i seguenti. Servono per fare in modo che le operazioni di cancellazione o sovrascrittura vengano eseguite dopo una richiesta di conferma.

alias rm='rm -i'[Invio]

alias cp='cp -i'[Invio]

alias mv='mv -i'[Invio]

Si può provare a eliminare un file per vedere cosa accade.

rm microinterruttore[Invio]

rm: remove `microinterruttore'?:

n[Invio]

In questo modo, il file non è stato cancellato.

Per l'eliminazione di un alias si procede intuitivamente con il comando unalias:

unalias elenca[Invio]

In questo modo, si elimina l'alias elenca in modo selettivo, mentre con il comando seguente si eliminano tutti gli alias ancora esistenti:

unalias -a[Invio]

A ogni modo, alla fine della sessione di lavoro con la shell, gli alias vengono perduti.

31.11   Conclusione

Il completamento dei nomi e i caratteri jolly sono gli strumenti operativi più importanti che una shell fornisce. Tuttavia, l'uso di modelli con caratteri jolly può essere fonte di errori anche gravi, pertanto, prima di utilizzarli in comandi distruttivi, conviene verificare l'effetto di questi modelli con echo.

La ridirezione e il condotto sono un altro strumento importante che permette di costruire comandi molto complessi a partire da comandi elementari.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome la_shell.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!