Comprendere i tubi e la redirezione per la linea di comando Linux

Due potenti funzionalità della shell della linea di comando Linux sono la redirezione e i tubi, che consentono di inviare l’output (o persino l’input) di un programma a un file o a un altro programma. Potresti aver già utilizzato queste funzionalità senza esserne consapevole. Ogni volta che hai usato il segno “ > ” in un comando o “ | ”, allora hai utilizzato rispettivamente la redirezione o un tubo.

In tutti i sistemi operativi simili a Unix, come Linux e FreeBSD, l’output di un programma della linea di comando va automaticamente in un luogo noto come output standard (stdout). Per impostazione predefinita, l’output standard è lo schermo (la console), ma questo può essere modificato usando tubi e redirezione. Allo stesso modo, la tastiera è considerata l’input standard (stdin) e, come per l’output standard, può essere cambiata.

Tubi

I tubi consentono di funnelare l’output di un comando in un altro, dove sarà utilizzato come input. In altre parole, l’output standard di un programma diventa l’input standard per un altro.

Il comando “ more ” prende l’input standard e lo impagina sull’output standard (lo schermo). Questo significa che se un comando visualizza più informazioni di quante possano essere mostrate su uno schermo, il programma “ more ” si fermerà dopo il primo schermo pieno (pagina) e attenderà che l’utente prema SPAZIO per vedere la pagina successiva o INVIO per vedere la riga successiva.

Ecco un esempio che elencherà tutti i file, con dettagli ( -la) nella directory /dev e canalizzerà l’output in more. La directory /dev dovrebbe avere dozzine di file e quindi assicurati che more debba impaginare.

ls-la/dev |more

ls pipe more

Nota il prompt --More-- nella parte inferiore dello schermo. Premi SPAZIO per vedere la pagina successiva e continua a premere SPAZIO fino al termine dell’output.

Ecco un altro esempio di tubo, questa volta utilizzando lo strumento “ wc ” (conteggio parole).

ls-1/dev |wc

wc conta il numero di righe, parole e caratteri nell’input standard. Se usi il parametro -l, visualizzerà solo il numero di righe, che è un buon modo per vedere quanti file ci sono in una directory!

Il tutorial “Uno sguardo approfondito ai comandi di archiviazione e compressione di Linux” ha un esempio che utilizza tar e 7-Zip insieme:

tar cvf - *| 7zr a -si somefiles.tar.7z

In questo caso, il trattino dopo l’opzione f dice a tar di inviare il suo output all’output standard e non a un file. L’output di tar sarà alimentato nel tubo all’interno di 7zr, che sta aspettando l’input dall’input standard a causa dell’opzione -si.

Redirezione

La redirezione è simile ai tubi, tranne per il fatto che utilizza file piuttosto che un altro programma. L’output standard per un programma è lo schermo. Utilizzando il simbolo > (maggiore di), l’output di un programma può essere inviato a un file. Ecco di nuovo un elenco di directory di /dev, ma questa volta reindirizzato a un file chiamato listing.txt.

ls-la> listing.txt

Non ci sarà nulla visualizzato nel terminale poiché tutto è stato inviato al file. Puoi dare un’occhiata al file usando il comando cat (che può essere canalizzato in more) oppure per comodità puoi semplicemente utilizzare il comando more da solo:

more listing.txt

Se listing.txt era già esistente, verrà sovrascritto. Ma puoi aggiungere a un file esistente utilizzando >> in questo modo:

ls-la/home > listing.txt  
ls-la/dev >> listing.txt

La prima redirezione sovrascriverà il file listing.txt, mentre la seconda vi aggiungerà.

Il comando cat può essere utilizzato per creare un file utilizzando la redirezione, ad esempio:

cat> atextfile.txt

Ora tutto il testo che digiti verrà inviato al file atextfile.txt fino a quando non premi Control-D, a quel punto il file sarà chiuso e tornerai al prompt dei comandi. Se desideri aggiungere più testo al file, usa lo stesso comando ma con due segni maggiori ( >>).

Conclusione

Molti dei programmi della linea di comando di Linux sono progettati per funzionare con redirezione e tubi, prova a sperimentarli e vedi come interagiscono. Ad esempio, l’output del comando ps, che elenca i processi attuali, può essere canalizzato in grep. Vedi se riesci a capire come elencare i processi di proprietà di root.