Canali
![]() Ultime news
![]() Ultimi articoli
![]() Le ultime dal Forum |
![]() Correlati
Il pezzo che stai leggendo è stato pubblicato oltre un anno fa.
![]() 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]. UsiL'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 homeEntriamo 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 correnteEsiste 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 substitutionCome 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. ConclusioniLa 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 Segnala ad un amico |
© Copyright 2025 BlazeMedia srl - P. IVA 14742231005