[Guida] Redirect e pipeline dell'I/O su sistemi GNU/Linux
Il redirect dell’I/O è la possibilità offerta dalla shell di modificare, per un dato processo, dove ricevere i dati di ingresso o verso dove scrivere i dati/errori di uscita. In questa questa mini-guida parleremo anche della concatenazione dei processi tramite la pipeline. Per effettuare queste operazioni utilizzeremo degli operatori specifici.
Redirect dell’I/O dei processi
Supponiamo di lanciare un programma da terminale. Semplificando si può affermare che questo interagisce con tre file denominati rispettivamente standard input, standard output e standard error. Effettuare un redirect, significa semplicemente modificare, per un dato processo, questi riferimenti. Per capire questo concetto in maniera immediata, utilizziamo il comando echo, il cui funzionamento è piuttosto banale: stampa a video la stringa che lo segue. Se vogliamo quindi redirezionare l’output in un file, piuttosto che allo standard output, basterà utilizzare l’istruzione echo riga1 > file.txt.
Gli operatori riassumendo sono i seguenti:
- comando > file // redirect dello std output;
- comando < file // redirect dello std input;
- comando >> file // redirect dello std output ma come append al contenuto del file;
- comando 2> file // redirect dello std error;
- comando &> file // redirect dello std output e std error.
Quindi, se vogliamo inserire il contenuto di una nuova istruzione, come append allo stesso file, useremo echo riga2 >> file.txt. Procediamo ora con il redirect dell’output di errore. Ad esempio per verificare lo stato della connessione potremo effettuare una deviazione dell’errore eventualmente generato da un ping, in uno specifico file.
Per concludere, non posso non citare il comando cat che, come suggerisce il nome dello stesso, redirezionato concatenererà tutti i file che gli forniamo come argomenti, in un unico file. Utile soprattutto in tutte quelle situazioni in cui, avendo più parti di un unico file originale, dobbiamo unificarle. La sintassi sarà la seguente:
cat parte1 parte2 parte3 > file-unico
Pipeline tra processi
Funzionalità altrettanto utile è senza dubbio il pipelining. Questa operazione permette infatti di mettere in comunicazione i processi ed effettuare così una concatenazione di comandi. L’operatore che utilizzeremo è ” | “, la barra verticale detta pipe. Si dice pipeline la sequenza di due o più comandi separati dal simbolo pipe.
Per capire meglio di cosa stiamo parlando utilizzeremo lemonbar, giusto per avere un approccio visivo. Ipotizziamo di avere questo script.sh, che restituisce come output l’ora esatta, ogni secondo. Provate a copiare nel terminale dall’istruzione while in poi, per capire di cosa si tratta.
Diamo come input a lemonbar l’output dello script: per farlo basterà la seguente istruzione (per uscire dal processo va usata la combinazione CTRL C):
bash script.sh | lemonbar -p
Si tratta quindi di una funzionalità molto potente e flessibile, poiché permette di effettuare una concatenazione tra vari programmi, andando a creare una vera e propria catena di montaggio, in cui il successivo elabora i risultati del precedente.
Seguiteci sul nostro canale Telegram, sulla nostra pagina Facebook e su Google News. Nel campo qui sotto è possibile commentare e creare spunti di discussione inerenti le tematiche trattate sul blog.