domenica 19 giugno 2011

Linux Bash Scripting for dummies: Bash vs Shell (parte 2)

Parentesi ed altri metacaratteri


Parentesi tonde

Un altro metacarattere che possiamo usare nella shell sono le parentesi, sia tonde che graffe, entrambe hanno un ruolo diverso vediamo quale:

Questo tipo di parentesi sono usate per richiamare la cosiddetta “subshell”, una subshell è a tutti gli effetti una shell vera e propria che viene creata al momento stesso in cui il comando inserito tra parentesi tonde viene evocato, per poi essere terminata non appena tale comando completa la sua esecuzione.

Lanciare un comando da solo, od una serie di comandi, dentro queste parentesi – di per se – non ha molta utilità, il vero beneficio lo abbiamo quando lanciamo un comando qualsiasi e un comando tra parentesi tonde, questo permette di parallelizzare l’esecuzione dei due comandi attraverso appunto la subshell.

Bisogna fare attenzione quando usiamo le subshells e le variabili, queste infatti rimangono visibili solo all’interno del codice inserito nella subshell; se per esempio lanciassimo

1 
echo $var (export var="questa è la mia variabile")

non otterremmo nulla a video perché la variabile $var è valida solo per gli eventuali comandi lanciati dentro la subshell, di tutto quello che succede dentro le parentesi, la “parent shell” – la shell dalla quale viene richiamata la subshell – non lo vede.

Negli script questo può risultare utile perché come ho appena detto l’uso delle subshell consente di parallelizzare i processi, potremmo quindi progettare lo script in due parti logiche una delle quali (la subshell) prepara eventuali files di configurazione o quanto altro potesse servire durante l’esecuzione dello script, impiegando idealmente metà del tempo.

Pipe

Che si legge “paip” ed è quel metacarattere identificato con “|”. Con esso possiamo lanciare un comando redirigendo l’output come input di un secondo comando, è più difficile a dirsi che a farsi.

Per esempio, abbiamo appena installato postfix su una macchina e vogliamo vedere se è configurato correttamente provando l’invio di una mail; tramite i comandi “echo” e “mail” possiamo fare tutto questo:

1 
echo "Questa è una mail di test"|mail -s "Mail di test" morfeus@ilportalinux.it

con echo stampiamo a video quello che sarà poi il corpo della mail, però inserendo la pipe a fine comando lasciamo che questa stampa venga intercettata dal comando mail (che accetta in input appunto, il corpo della mail da mandare) che confeziona un bel messaggio con subject “Mail di test” e la spedisce al mio account.

Questo è un uso molto semplice della pipe, negli script personalmente faccio un largo uso di pipe per il parsing e l’editing dei file, facendone stampare il contenuto (o anche solo la parte che mi interessa) e mandandola in pipe ad altri programmi come sed od awk per costruire un altro file nella maniera che mi serve.

Parentesi graffe

Questo tipo di parentesi rappresentano un blocco che deve essere espanso ricorsivamente, per esempio, col comando:

1 
:~$ echo p{app,ap,al}a

avremo in output

pappa papa pala

od ancora, normalmente per creare la copia di backup di un file usiamo il comando “cp” in questo modo:

1 
:~$ cp miofile.conf miofile.conf.bck

ecco adesso che sappiamo usare le parentesi graffe la prossima volta daremo:

1 
:~$ cp miofile.conf{,.bck}

ottenendo lo stesso risultato, ed ancora, dopo aver editato il file in più riprese non ci ricordiamo più cos’è che abbiamo cambiato, normalmente useremmo:

1 
vimdiff miofile.conf miofile.conf.bck

ma adesso che siamo pro ci risparmiamo le dita e digitiamo:

1 
vimdiff miofile.conf{,.bck}

et voilà… (avete notato la virgola? fate attenzione a non dimenticarvela quando usate questa sintassi).

Per questa settimana è tutto, ci sono chiaramente una miriade di altri operatori nella bash, elencarli tutti è impossibile, ma io ti ho dato lo spunto; adesso prova a leggerti qualche script semplice e segnati quello che non capisci, se vuoi puoi chiedere nei commenti qui sotto :)


da http://www.ilportalinux.it/linux-bash-scripting-for-dummies-bash-vs-shell/2/

Nessun commento: