MegaLab.it
Stampa Articolo
Aperiodico gratuito di informatica
 
20100315082222_2012545650_20100315082148_238549527_replace.png

Command substitution: una funzione base delle shell testuali

a cura di masterz3d
14/05/2010 - articolo
Linux & Open Source - La sostituzione di comandi in una shell UNIX è un altro dei concetti di base che vanno appresi per poter utilizzare al meglio e con più soddisfazione le console testuali.

Tra le funzioni principali di Bash, una delle più usate è la sostituzione di comandi, o command substitution. Usando la sostituzione di comandi Bash non interpreta il comando, ma il suo output. Questo concetto vale sia per i comandi che per le loro opzioni.

Una command substitution si ottiene con:

$(LISTA)

Oppure

`LISTA`

Dove `` sono apici inversi e non apostrofi normali. [1]

Bash eseguirà la lista di comandi LISTA e, prima di interpretarla, la sostituirà con il suo output. [2] [3].

Usi

L'utilizzo principale della command substitution è la determinazione di un parametro o di un'opzione di un altro comando, in modo da poter "condensare" due o più invocazioni in un solo comando.

Un vantaggio indiretto è il fatto che non è necessario sapere "a priori" un parametro, un percorso o una caratteristica di qualche cosa, perché con la command substitution possiamo determinarlo "on-the-fly" e darlo subito "in pasto" al comando evocato da Bash direttamente.

Esempio 1: directory home

Entriamo nella directory home dell'utente corrente con

cd $(echo ~) [4]

Teniamo presente l'effetto della sostituzione dei comandi, e ricordando che

echo ~

Mostra a video il percorso della directory home dell'utente, ponendola uguale a /home/utente, il comando è equivalente a

cd /home/utente

Esempio 2: entrare nella directory dei moduli del kernel corrente

Esiste un programmino, chiamato uname, che ha un'opzione (-r) che permette di mostrare a video la versione del kernel corrente.

I moduli del kernel Linux, se presenti, sono situati in una sottodirectory di /lib/modules, e per la precisione il suo nome è il numero di versione del kernel in uso. Quindi, ricordando l'output di uname -r, abbiamo:

cd /lib/modules/$(uname -r)/kernel

Nelle righe riportate, la versione del mio kernel è 2.6.31-gentoo-r6.

Esempio 3: pipeline in command substitution

Come ho già detto, non solo comandi semplici possono essere sostituiti, ma anche pipeline. Se vogliamo visualizzare l'IP della nostra scheda di rete, possiamo creare un concatenamento di questo tipo:

sudo ifconfig eth0 | grep -i "inet addr" | awk '{ print $2 }' | cut -d: -f2

Seguiamo ora tutto il concatenamento passo per passo, considerando un output per volta, da sinistra verso destra, cominciando da sudo ifconfig eth0.

Command_substitution_001.png

Viene mostrata la "carta d'identità" della scheda di rete eth0, se attiva. [5]

Ne filtriamo l'output con grep -i "inet addr":

Command_substitution_002.png

In questo caso grep filtra la riga (o, per default, tutte le righe) in cui compaia il parametro "inet addr". Ora spezziamo la riga filtrata con awk '{ print $2 }':

Command_substitution_003.png

Tagliamo poi questa stringa con cut, usando i due punti come delimiter e ne prendiamo la seconda parte, ottenendo esattamente l'IP della scheda di rete eth0:

Command_substitution_004.png

Al termine del concatenamento è come se l'invocazione di ifconfig si trasformasse in un'invocazione di echo:

echo <IP>

Infatti, l'output del concatenamento è esattamente uguale all'ultima riga di comando mostrata, se al posto di <IP> ci fosse l'IP reale della nostra scheda di rete.

Conclusioni

La sostituzione di comandi, oltre ad essere una caratteristica di base di Bash, è molto comunemente usata in molti script di avvio ed è di grande aiuto in moltissime occasioni, soprattutto quando non si conoscono a priori una o più parti dei parametri di un comando. Inoltre, invito l'utente a fare esercizio, prima di tutto semplicemente leggendo gli script di sistema e tentando di capire come funzionano, e poi provando a mettere in pratica la sostituzione di comandi prendendo come esempio questi script.

Note

[1]: Gli apici inversi si ottengono con ALTGr+'

[2]: È possibile innestare più command substitution usando $() o `` più volte. Vige la regola del First In Last Out di costrutti for..then..else o for..do..done di linguaggi di programmazione come il C o scripting Bash.

[3]: la lista di comandi può essere una concatenazione logica o lineare, o più frequentemente una pipeline.

[4]: il carattere tilde (~) si può ottenere con la combinazione ALTGr+^.

[5]: la scheda di rete attiva è solitamente eth0, ma potrebbe cambiare da computer a computer, come eth1 o eth2, o potrebbe essere una scheda wireless, come wlan0 o wlan1.

MegaLab.it rispetta la tua privacy. Per esercitare i tuoi diritti scrivi a: privacy@megalab.it .

Copyright 2008 MegaLab.it - Tutti i diritti sono riservati