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].
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.
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
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.
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.
Viene mostrata la "carta d'identità" della scheda di rete eth0, se attiva. [5]
Ne filtriamo l'output con grep -i "inet addr":
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 }':
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:
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.
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.
[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