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
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 |wcwc 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.7zIn 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.txtNon 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.txtSe 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.txtLa 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.txtOra 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.