Un’introduzione alla ridirezione I/O di Linux

Introduzione

Le capacità di reindirizzamento integrate in Linux forniscono un insieme robusto di strumenti per ottimizzare molti flussi di lavoro. La “filosofia Unix” dello sviluppo software era quella di creare strumenti che ognuno svolgesse bene una singola funzione, e questa filosofia è stata portata avanti fino agli strumenti moderni della riga di comando, che sono potenti individualmente e ancora di più quando combinati. Che tu stia scrivendo software complesso o semplicemente lavorando sulla riga di comando, sapere come manipolare i diversi flussi di I/O nel tuo ambiente aumenterà notevolmente la tua produttività.

Prerequisiti

Per seguire questa guida, avrai bisogno di avere accesso a un server Linux. Se hai bisogno di informazioni su come connetterti al tuo server per la prima volta, puoi seguire la nostra guida su come connettersi a un server Linux utilizzando SSH.

Flussi

L’input e l’output nell’ambiente Linux sono distribuiti su tre flussi. Questi flussi sono:

  • input standard (stdin)

  • output standard (stdout)

  • errore standard (stderr)

I flussi sono anche numerati:

  • stdin (0)

  • stdout (1)

  • stderr (2)

Durante le interazioni standard tra l’utente e il terminale, l’input standard proviene dalla tastiera dell’utente. L’output standard e l’errore standard vengono visualizzati sul terminale dell’utente come testo. Collettivamente, i tre flussi sono denominati flussi standard.

Input Standard

Lo stream di input standard di solito trasporta dati da un utente a un programma. I programmi che si aspettano l’input standard di solito ricevono l’input da un dispositivo, come una tastiera. Più avanti in questo tutorial, vedrai esempi di utilizzo dell’output di un programma come input standard per un altro.

Output Standard

L’output standard è l’output generato da un programma. Quando lo stream di output standard non è reindirizzato, verrà emesso del testo direttamente sul terminale. Prova a emettere del testo arbitrario utilizzando il comando echo:

  1. echo Sent to the terminal
Output
Sent to the terminal

Quando viene utilizzato senza opzioni aggiuntive, il comando echo emette qualsiasi argomento che gli viene passato sulla riga di comando.

Esegui echo senza argomenti:

  1. echo

Restituirà una riga vuota. Alcuni programmi non fanno nulla senza argomenti forniti.

Errore Standard

L’errore standard contiene gli errori generati da un programma che ha fallito in qualche modo. Come per l’output standard, la destinazione predefinita per questo stream è il display del terminale.

Vediamo un esempio di base di errore standard utilizzando il comando ls. ls elenca i contenuti di una directory.

Quando viene eseguito senza un argomento, ls elenca i contenuti all’interno della directory corrente. Se ls viene eseguito con una directory come argomento, elencherà i contenuti della directory fornita.

  1. ls %

Dato che % non è una directory esistente, ciò invierà il seguente testo all’errore standard:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

Reindirizzamento dello stream

Linux include comandi di reindirizzamento per ciascuno stream. Questi possono essere utilizzati per scrivere l’output standard o l’errore standard su un file. Se si scrive su un file che non esiste, verrà creato un nuovo file con quel nome prima della scrittura.

I comandi con una parentesi angolare sovrascrivono il contenuto esistente della destinazione.

Sovrascrittura

  • > – output standard

  • < – input standard

  • 2> – errore standard

I comandi con una doppia parentesi angolare non sovrascrivono il contenuto esistente della destinazione.

Aggiunta

  • >> – output standard

  • << – input standard

  • 2>> – errore standard

Tubature

Le tubature vengono utilizzate per reindirizzare uno stream da un programma a un altro. Quando l’output standard di un programma viene inviato a un altro tramite una tubatura, l’output del primo programma verrà utilizzato come input per il secondo, invece di essere stampato sul terminale. Saranno visualizzati solo i dati restituiti dal secondo programma.

La tubatura di Linux è rappresentata da una barra verticale: |

Ecco un esempio di comando che utilizza una tubatura:

  1. ls | less

Questo prende l’output di ls, che visualizza il contenuto della tua directory corrente, e lo invia al programma less. less visualizza i dati inviati ad esso una riga alla volta.

ls di solito visualizza i contenuti della directory su più righe. Quando lo esegui tramite less, ogni voce viene inserita su una nuova riga.

Anche se la funzionalità della tubatura può sembrare simile a quella di > e >>, la distinzione è che le tubature reindirizzano i dati da un comando a un altro, mentre > e >> vengono utilizzati per reindirizzare esclusivamente verso file.

Filtri

I filtri sono una classe di programmi comunemente utilizzati con l’output inviato da un altro programma. Molti di essi sono anche utili da soli, ma illustrano particolarmente bene il comportamento del piping.

  • trova – restituisce i file con nomi di file che corrispondono all’argomento passato a trova.

  • grep – restituisce il testo che corrisponde al modello di stringa passato a grep.

  • tee – reindirizza l’input standard sia all’output standard che a uno o più file.

  • tr – trova e sostituisce una stringa con un’altra.

  • wc – conta caratteri, righe e parole.

Esempi

Ora che ti sei familiarizzato con il reindirizzamento, il piping e i filtri di base, vediamo alcuni schemi e esempi comuni di reindirizzamento.

Il modello command > file reindirizza l’output standard di un comando su un file.

  1. ls ~ > root_dir_contents.txt

Il comando sopra passa i contenuti della tua directory home (~) come output standard e scrive l’output su un file chiamato root_dir_contents.txt. Cancellerà eventuali contenuti precedenti nel file, poiché è un comando a singola parentesi.

Il modello command > /dev/null reindirizza l’output standard verso il nulla. /dev/null è un file speciale utilizzato per scartare eventuali dati che vengono reindirizzati verso di esso. Viene utilizzato per eliminare l’output standard non necessario e che potrebbe altrimenti interferire con la funzionalità di un comando o di uno script. Qualsiasi output inviato a /dev/null viene scartato.

  1. ls > /dev/null

Questo comando scarta lo stream di output standard restituito dal comando ls passandolo a /dev/null.

Il modello command 2> file reindirizza lo stream di errori standard di un comando su un file, sovrascrivendo i contenuti esistenti.

  1. mkdir '' 2> mkdir_log.txt

Questo reindirizza l’errore generato dal nome della directory non valido '' e lo scrive in log.txt. Nota che l’errore viene comunque inviato al terminale e visualizzato come testo.

Il modello command >> file reindirizza l’output standard di un comando su un file senza sovrascrivere i contenuti esistenti del file.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

Questo insieme di comandi reindirizza prima l’input testuale inserito dall’utente tramite echo in un nuovo file. Successivamente, aggiunge il testo ricevuto dal secondo comando echo al file esistente, senza sovrascriverne i contenuti.

Il modello command 2>> file sopra reindirizza lo stream di errore standard di un comando su un file senza sovrascrivere il contenuto esistente del file. Questo modello è utile per creare log degli errori per un programma o un servizio, poiché il file di log non avrà il suo contenuto precedente cancellato ogni volta che il file viene scritto.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

Il comando sopra reindirizza il messaggio di errore causato da un argomento find non valido su un file chiamato stderr_log.txt. Quindi, aggiunge il messaggio di errore causato da un argomento wc non valido allo stesso file.

Il modello command | command reindirizza l’output standard del primo comando all’input standard del secondo comando.

  1. find /var lib | grep deb

Questo comando cerca in /var e nelle sue sottocartelle i nomi file e le estensioni che corrispondono alla stringa deb, e restituisce i percorsi dei file, con la parte corrispondente evidenziata in rosso.

Il modello command | tee file (che include il comando tee) reindirizza l’output standard del comando su un file e sovrascrive il suo contenuto. Quindi, visualizza l’output reindirizzato nel terminale. Crea un nuovo file se il file non esiste già.

Nel contesto di questo modello, tee viene tipicamente utilizzato per visualizzare l’output di un programma mentre contemporaneamente lo si salva su un file.

  1. wc /etc/magic | tee magic_count.txt

Questo indirizza i conteggi per caratteri, righe e parole nel file /etc/magic (usato dalla shell Linux per determinare i tipi di file) al comando tee, che poi divide l’output di wc in due direzioni e lo invia alla visualizzazione del terminale e al file magic_count.txt. Per il comando tee, immagina la lettera T. La parte inferiore della lettera è il dato iniziale, mentre la parte superiore è il dato diviso in due direzioni diverse (output standard e terminale). Le pipe multiple possono essere usate per reindirizzare l’output attraverso più comandi e/o filtri.

Conclusion

Imparare a utilizzare le capacità di reindirizzamento incorporate nella riga di comando Linux è una competenza cruciale. Ora che hai visto i fondamenti di come funzionano i reindirizzamenti e le pipe, sarai in grado di iniziare il tuo viaggio nel mondo dello scripting della shell, che fa un uso frequente dei programmi e dei modelli evidenziati in questa guida.

La ricerca di comandi specifici o di qualcosa che desideri fare nella riga di comando (ad esempio “eliminare tutti i file in una directory che iniziano con una lettera maiuscola”) può anche rivelarsi utile quando devi completare un compito specifico usando la riga di comando.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection