2011-06-29

Sequenze di comandi con la shell

Da sempre la shell Unix ha permesso di impartire sequenze di comandi che avessero qualche correlazione tra di loro, le correlazioni sono molteplici e proverò con questo post a descriverle.
Il primo modo per impartire una serie di comandi è di digitare i comandi uno di seguito all'altro terminando ognuno con ENTER, con la shell interattiva il comando successivo viene eseguito al termine del comando precedente ma non prima di aver premuto il tasto ENTER che lo sottomette. Per evitare il tempo di attesa tra la fine del primo comando e la pressione del tasto ENTER per il successivo si può iniziare a digitare il comando anche prima della comparsa del prompt da parte della shell ma non sempre si riesce ad essere sufficientemente veloci; a tal proposito si possono digitare i comandi separati da punto e virgola ( ; ) e premere ENTER solo alla fine dell'ultimo. In questo modo i comandi verranno eseguiti uno di seguito all'altro senza attese. Esempio per consultare l'orario prima e dopo l'esecuzione di una copia di directory:
date ; cp -a src_dir dst_dir ; date
L'esecuzione dei comandi successivi può essere condizionata in base all'esito del precedente: separando con && due comandi si condiziona l'esecuzione del secondo in base all'esito del primo, se il primo si conclude positivamente allora viene eseguito anche il secondo. Ricordo che per esito positivo si intende che l'exit code del programma deve essere 0 ( zero ), l'exit code di un programma può essere verificato con la shell utilizzando la variabile predefinita $? . La sequenza di comandi può essere lunga a piacere. Esempio di comando condizionato dal precedente, se la compilazione si completa positivamente si può eseguire il programma:
cc -o prova prova.c && ./prova

Il condizionamento di esecuzione può essere anche invertito con || in modo tale da eseguire il secondo solo se il primo è fallito ( quindi exit code diverso da zero ). Esempio di comando alternativo eseguendo telnet se ssh fallisce, si sa che è preferibile ssh a telnet ma in sua assenza...:
ssh server || telnet ssh
I programmi possono essere eseguiti anche contemporaneamente separandoli con & che permette di eseguire il secondo appena iniziata l'esecuzione del primo, senza attenderne la fine. Esempio di esecuzione contemporanea di cancellazione di un file grande e la copia di un altro:
rm /tmp/grande_file & cp /tmp/altro_file /altrove/altro_file
Terminando con & l'ultimo ( o l'unico ) comando si ottiene di nuovo il prompt appena avviato il comando in modo da poter interagire subito di nuovo con la shell.
Un altro modo molto utilizzato per definire una sequenza di comandi è quello che redirige l'output ( che normalmente finirebbe sullo schermo ) come input ( normalmente la tastiera ) del comando seguente, per fare ciò si separano i due comandi con | ed i due programmi verranno eseguiti contemporaneamente con il sistema operativo che passa i dati in uscita dal primo nell'ingresso del secondo. Esempio di calcolo di occupazione di spazio su disco dei file o directory in ordine crescente di occupazione:
du -s * | sort -n

Nessun commento:

Posta un commento