back to top

Pipeline e Redirezionamenti in Linux

Utilizzando la shell di Linux, puoi gestire in modo efficace l’input e l’output dei tuoi programmi, sfruttando a pieno le potenzialitร  offerte da questi strumenti. In questa lezione esploreremo dettagliatamente i tre canali standard gestiti dalla shell di Linux e come utilizzare le pipeline e i redirezionamenti per semplificare il tuo lavoro e migliorare l’efficienza del tuo codice.

I canali standard della Shell di Linux

La shell di Linux gestisce tutti i programmi avviati attraverso 3 canali standard. Questi tre canali sono:

Pubblicitร 
  • stdin (standard input – file descriptor 0) – รจ il canale attraverso il quale il programma riceve i dati di ingresso (generalmente questo canale รจ la tastiera del terminale);
  • stdout (standard output – file descriptor 1) – รจ il canale attraverso il quale “esce” il risultato dell’elaborazione del programma (di solito รจ il video del terminale);
  • stderr (standard error – file descriptor 2) – รจ il canale attraverso il quale vengono mostrati gli eventuali errori in fase di elaborazione (di solito รจ il video del terminale);

Normalmente i programmi UNIX prevedono che l’ingresso dei dati avvenga mediante lo standard input e l’elaborazione venga mostrata con lo standard output; tuttavia รจ possibile intervenire ed “alterare” i canali di entrata e di uscita. Per farlo si fa ricorso alla pipeline ed ai cosiddetti redirezionamenti (redirection) attraverso i quali รจ possibile “incanalare” l’output di un programma verso un altro programma, verso un file o un dispositivo. Questo approccio ci offre la flessibilitร  di combinare strumenti e gestire il flusso di dati in modo piรน efficiente.

Concatenare programmi: la pipeline

Come detto, รจ possibile fare in modo che l’output del programma1 divenga l’input del programma2. Vediamo come:

programma1 | programma2

Per concatenare due programmi si usa, quindi, il carattere |, cioรจ la barra verticale anche detta pipe. Si dice pipeline la sequenza di due o piรน comandi separati dal simbolo pipe. Questa funzionalitร  รจ particolarmente utile quando si desidera, per esempio, filtrare i dati di output di un programma attraverso un altro comando che ne modifica o suddivide il contenuto.

Redirezionamenti

รˆ anche possibile redirezionare l’output verso un file (in questo caso l’output del programma verrร  scritto all’interno del file indicato):

programma > nome_file

Allo stesso modo รจ possibile prendere il contenuto di un file ed utilizzarlo come standard input di un programma:

programma < nome_file

Come potete notare, la sintassi รจ la medesima; ciรฒ che cambia รจ la “direzione”:

  • > (in uscita)
  • < (in entrata)

Qualora si voglia redirigere lo stderr, si userร  2> in questo modo:

programma 2> nome_file

Qualora si desideri redirezionare sia stdout che stderr di un programma si utilizzerร  la seguente sintassi:

programma > nome_file 2>&1

La sintassi 2>&1, infatti, sta ad indicare che lo standard error dovrร  essere redirezionato allo standard output (il quale, nel nostro esempio, รจ a sua volta redirezionato verso un file). Questo teorema risulta estremamente utile per il debugging, poichรฉ consente di registrare errori e output in un solo file di log.

รˆ anche possibile scegliere di “appendere” (invece di sovrascrivere) il contenuto in uscita (standard output) a quello di un file giร  esistente. Per farlo si userร  la seguente sintassi:

programma >> nome_file

In questo caso lo stdout di programma verrร  aggiunto all’eventuale contenuto del file nome_file e qualora questo non esista verrร  creato. Questo รจ un ottimo modo per registrare output successivi senza perdere dati precedenti, utile in situazioni di logging o output continuo.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).