La shell di Linux gestisce tutti i programmi avviati attraverso 3 canali standard. Questi tre canali sono:
- stdin (stabdard input – file descriptor 0) – è il canale attraverso il quale il programma riceve i dati di ingresso (generalmente questo canale è la tastiera del terminale);
- stdout (stabdard output – file descriptor 1) – è il canale attraverso il quale "esce" il risultato dell’elaborazione del programma (di solito è il video del terminale);
- stderr (stabdard 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 stabdard output, tuttavia è possibile intervenire ed "alterare" i canali di entrata e di uscita. Per farlo si fa ricorso alla pipeline ed ai cosidetti redirezionamenti (redirection) attraverso i quali è possibile "incanalare" l’output di un programma verso un altro programma, verso un file o un dispositivo.
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.
Redirezionamenti
E’ anche possibile redirezionare l’output verso un file (in questo cas 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 sinatssi:
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).
E’ 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.