Punto informatico Network

Canali
20100315082222_2012545650_20100315082148_238549527_replace.png

Command substitution: una funzione base delle shell testuali

14/05/2010
- A cura di
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.

Tag

Passa qui con il mouse e visualizza le istruzioni per utilizzare i tag!

command (1) .

Valutazione

  •  
Voto complessivo 4 calcolato su 12 voti

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.

Pagine
  1. Basi
  2. Note

 

Segnala ad un amico

Tuo nome Tuo indirizzo e-mail (opzionale)
Invia a:
    Aggiungi indirizzo email
    Testo

    megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2017 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising

    • Gen. pagina: 0.35 sec.
    •  | Utenti conn.: 121
    •  | Revisione 2.0.1
    •  | Numero query: 20
    •  | Tempo totale query: 0.22