{"id":3637,"date":"2026-07-16T22:55:04","date_gmt":"2026-07-16T20:55:04","guid":{"rendered":"https:\/\/rootmail.it\/courses\/lpic-1-exam-101-010-160-corso-completo-in-italiano\/lessons\/103-3-utilizzare-stream-pipe-e-reindirizzamenti\/"},"modified":"2026-07-20T21:57:31","modified_gmt":"2026-07-20T19:57:31","slug":"103-3-utilizzare-stream-pipe-e-reindirizzamenti","status":"publish","type":"lesson","link":"https:\/\/rootmail.it\/en\/courses\/lpic-1-exam-1-101-500-corso-completo-in-italiano\/lessons\/103-3-utilizzare-stream-pipe-e-reindirizzamenti\/","title":{"rendered":"103.3 Utilizzare stream, pipe e reindirizzamenti"},"content":{"rendered":"<h2>103.3 Utilizzare stream, pipe e reindirizzamenti<\/h2>\n<p>Uno dei principi fondamentali dei sistemi GNU\/Linux \u00e8 la possibilit\u00e0 di far collaborare pi\u00f9 programmi attraverso lo scambio di dati. Ogni comando pu\u00f2 ricevere informazioni in ingresso, elaborarle e produrre un risultato che pu\u00f2 essere visualizzato sullo schermo, salvato in un file oppure utilizzato direttamente da un altro comando.<\/p>\n<p>Questo meccanismo \u00e8 reso possibile grazie ai <strong>flussi standard (stream)<\/strong>, alle <strong>pipe<\/strong> e ai <strong>reindirizzamenti<\/strong>, strumenti che consentono di costruire potenti sequenze di comandi senza dover ricorrere a programmi complessi o creare file temporanei.<\/p>\n<p>In questa lezione imparerai a gestire i tre flussi standard di Linux (<strong>stdin<\/strong>, <strong>stdout<\/strong> e <strong>stderr<\/strong>), a collegare pi\u00f9 comandi mediante le pipe e a reindirizzare input e output verso file o altri programmi. Queste competenze rappresentano uno dei pilastri dell&#8217;amministrazione di sistemi Linux e sono indispensabili per scrivere script efficaci e automatizzare le attivit\u00e0 quotidiane.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Exam Tip<\/strong> Per l&#8217;esame LPIC-1 \u00e8 fondamentale conoscere il funzionamento dei tre stream standard (<code>stdin<\/code>, <code>stdout<\/code> e <code>stderr<\/code>), il simbolo della pipe (<code>|<\/code>) e i principali operatori di reindirizzamento come <code>&gt;<\/code>, <code>&gt;&gt;<\/code>, <code>&lt;<\/code>, <code>2&gt;<\/code> e <code>2&gt;&amp;1<\/code>.<\/p><\/blockquote>\n<hr \/>\n<h2>\ud83c\udfaf Obiettivi della lezione<\/h2>\n<p>Al termine di questa lezione sarai in grado di:<\/p>\n<ul>\n<li>comprendere il ruolo dei flussi standard (<code>stdin<\/code>, <code>stdout<\/code> e <code>stderr<\/code>);<\/li>\n<li>utilizzare le pipe per collegare pi\u00f9 comandi tra loro;<\/li>\n<li>reindirizzare l&#8217;output e gli errori verso file o altri programmi;<\/li>\n<li>utilizzare il comando <code>tee<\/code> per visualizzare e salvare contemporaneamente l&#8217;output;<\/li>\n<li>costruire pipeline efficienti combinando i principali strumenti GNU\/Linux.<\/li>\n<\/ul>\n<hr \/>\n<h2>Argomenti trattati<\/h2>\n<ul>\n<li>I tre stream standard di Linux.<\/li>\n<li>Le pipe e la concatenazione dei comandi.<\/li>\n<li>Reindirizzamento dell&#8217;input e dell&#8217;output.<\/li>\n<li>Gestione dell&#8217;output degli errori.<\/li>\n<li>Utilizzo del comando <code>tee<\/code>.<\/li>\n<li>Best practice nella gestione dei flussi di dati.<\/li>\n<\/ul>\n<blockquote><p><strong>\u2328\ufe0f Provalo subito<\/strong><br \/>\nApri un terminale Linux e sperimenta le pipe e i reindirizzamenti mostrati durante la lezione. Imparare a combinare pi\u00f9 comandi \u00e8 una delle competenze pi\u00f9 importanti per utilizzare al meglio la shell Linux.<\/p><\/blockquote>\n<h2>103.3.1 Comprendere gli stream standard<\/h2>\n<p>Ogni programma eseguito in Linux comunica con il sistema operativo attraverso uno o pi\u00f9 <strong>flussi di dati (stream)<\/strong>. Gli stream rappresentano i canali utilizzati per ricevere dati in ingresso, produrre risultati e segnalare eventuali errori.<\/p>\n<p>Per impostazione predefinita, questi flussi sono collegati al terminale, ma possono essere facilmente reindirizzati verso file, altri programmi o dispositivi. Comprendere il funzionamento degli stream \u00e8 essenziale per sfruttare appieno la potenza della shell Linux.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Exam Tip<\/strong> Per l&#8217;esame LPIC-1 \u00e8 fondamentale conoscere i tre stream standard: <strong>stdin<\/strong>, <strong>stdout<\/strong> e <strong>stderr<\/strong>, oltre al loro comportamento predefinito.<\/p><\/blockquote>\n<hr \/>\n<h3>I tre stream standard<\/h3>\n<p>Ogni processo Linux dispone normalmente di tre flussi standard.<\/p>\n<table>\n<thead>\n<tr>\n<th>Stream<\/th>\n<th>Nome<\/th>\n<th>Destinazione predefinita<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>stdin (0)<\/strong><\/td>\n<td>Standard Input<\/td>\n<td>Tastiera<\/td>\n<\/tr>\n<tr>\n<td><strong>stdout (1)<\/strong><\/td>\n<td>Standard Output<\/td>\n<td>Terminale<\/td>\n<\/tr>\n<tr>\n<td><strong>stderr (2)<\/strong><\/td>\n<td>Standard Error<\/td>\n<td>Terminale<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Ogni stream possiede un proprio <strong>file descriptor<\/strong>, un identificatore numerico utilizzato dal sistema operativo:<\/p>\n<ul>\n<li><strong>0<\/strong> \u2192 Standard Input (<code>stdin<\/code>)<\/li>\n<li><strong>1<\/strong> \u2192 Standard Output (<code>stdout<\/code>)<\/li>\n<li><strong>2<\/strong> \u2192 Standard Error (<code>stderr<\/code>)<\/li>\n<\/ul>\n<p>Questi numeri verranno utilizzati nei reindirizzamenti che vedremo nelle prossime sezioni.<\/p>\n<hr \/>\n<h3>Standard Input (stdin)<\/h3>\n<p>Lo <strong>Standard Input<\/strong> rappresenta il canale attraverso il quale un programma riceve i dati in ingresso.<\/p>\n<p>Per impostazione predefinita, lo <code>stdin<\/code> \u00e8 collegato alla tastiera.<\/p>\n<p>Ad esempio:<\/p>\n<pre><code>cat\r\n<\/code><\/pre>\n<p>Dopo aver eseguito il comando, tutto ci\u00f2 che viene digitato viene inviato a <code>cat<\/code>, che lo visualizza immediatamente sullo schermo.<\/p>\n<p>L&#8217;esecuzione termina premendo <strong>Ctrl + D<\/strong>, che segnala la fine dell&#8217;input.<\/p>\n<hr \/>\n<h3>Standard Output (stdout)<\/h3>\n<p>Lo <strong>Standard Output<\/strong> \u00e8 il canale utilizzato dai programmi per inviare il risultato delle operazioni eseguite.<\/p>\n<p>Per impostazione predefinita, lo <code>stdout<\/code> \u00e8 collegato al terminale.<\/p>\n<p>Ad esempio:<\/p>\n<pre><code>echo \"Benvenuto in Linux\"\r\n<\/code><\/pre>\n<p>Output:<\/p>\n<pre><code>Benvenuto in Linux\r\n<\/code><\/pre>\n<p>Nelle prossime sezioni vedremo come reindirizzare questo output verso un file anzich\u00e9 visualizzarlo sullo schermo.<\/p>\n<hr \/>\n<h3>Standard Error (stderr)<\/h3>\n<p>Lo <strong>Standard Error<\/strong> viene utilizzato esclusivamente per i messaggi di errore.<\/p>\n<p>Anche questo flusso, per impostazione predefinita, \u00e8 collegato al terminale.<\/p>\n<p>Ad esempio:<\/p>\n<pre><code>ls file_inesistente\r\n<\/code><\/pre>\n<p>Output:<\/p>\n<pre><code>ls: impossibile accedere a 'file_inesistente': File o directory non esistente\r\n<\/code><\/pre>\n<p>Separare lo <code>stderr<\/code> dallo <code>stdout<\/code> permette di gestire in modo indipendente risultati e messaggi di errore, caratteristica molto utile negli script Bash.<\/p>\n<hr \/>\n<h3>Perch\u00e9 esistono tre stream separati?<\/h3>\n<p>La separazione dei flussi consente una gestione molto pi\u00f9 flessibile dei programmi.<\/p>\n<p>Ad esempio \u00e8 possibile:<\/p>\n<ul>\n<li>salvare solo l&#8217;output normale in un file;<\/li>\n<li>registrare gli errori in un file separato;<\/li>\n<li>inviare l&#8217;output di un comando come input di un altro programma;<\/li>\n<li>automatizzare operazioni complesse senza modificare i programmi.<\/li>\n<\/ul>\n<p>Questa architettura rappresenta uno degli elementi fondamentali della filosofia Unix.<\/p>\n<blockquote><p><strong>\ud83d\udccc Da ricordare<\/strong> Anche se <strong>stdout<\/strong> e <strong>stderr<\/strong> vengono normalmente visualizzati entrambi nel terminale, si tratta di due flussi completamente distinti che possono essere reindirizzati separatamente.<\/p><\/blockquote>\n<hr \/>\n<h3>Best Practice<\/h3>\n<p>Quando sviluppi script Bash o automatizzi attivit\u00e0 amministrative, gestisci sempre separatamente l&#8217;output normale e i messaggi di errore. Questo rende gli script pi\u00f9 affidabili, facilita il troubleshooting e permette di registrare gli errori senza perdere i risultati dell&#8217;elaborazione.<\/p>\n<hr \/>\n<h3>Riepilogo<\/h3>\n<ul>\n<li>Ogni programma Linux utilizza tre stream standard.<\/li>\n<li><strong>stdin (0)<\/strong> riceve i dati in ingresso.<\/li>\n<li><strong>stdout (1)<\/strong> produce l&#8217;output normale.<\/li>\n<li><strong>stderr (2)<\/strong> produce i messaggi di errore.<\/li>\n<li>I tre stream possono essere reindirizzati indipendentemente.<\/li>\n<li>La separazione degli stream rappresenta uno dei principi fondamentali dei sistemi Unix.<\/li>\n<\/ul>\n<h2>103.3.2 Reindirizzamenti<\/h2>\n<p>I <strong>reindirizzamenti (redirections)<\/strong> consentono di modificare la sorgente dei dati in ingresso o la destinazione dell&#8217;output prodotto da un comando. Invece di leggere i dati dalla tastiera o visualizzare il risultato sul terminale, \u00e8 possibile utilizzare file o altri dispositivi.<\/p>\n<p>Questa funzionalit\u00e0 \u00e8 uno dei pilastri della shell Linux e viene utilizzata quotidianamente nell&#8217;amministrazione dei sistemi e nella scrittura di script.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Exam Tip<\/strong> Per l&#8217;esame LPIC-1 \u00e8 fondamentale conoscere gli operatori di reindirizzamento <code>&gt;<\/code>, <code>&gt;&gt;<\/code>, <code>&lt;<\/code>, <code>2&gt;<\/code> e la differenza tra il reindirizzamento dello <strong>stdout<\/strong> e dello <strong>stderr<\/strong>.<\/p><\/blockquote>\n<hr \/>\n<h3>Reindirizzare lo Standard Output<\/h3>\n<p>Per impostazione predefinita, l&#8217;output di un comando viene visualizzato sul terminale (stdout).<\/p>\n<p>Per salvarlo in un file si utilizza l&#8217;operatore <code>&gt;<\/code>.<\/p>\n<p>Esempio:<\/p>\n<pre><code>echo \"Hello, World\" &gt; hello.txt\r\n<\/code><\/pre>\n<p>Se il file non esiste viene creato automaticamente.<\/p>\n<p>Se il file esiste gi\u00e0, il suo contenuto viene completamente sostituito.<\/p>\n<blockquote><p><strong>\u26a0\ufe0f Attenzione<\/strong> L&#8217;operatore <code>&gt;<\/code> sovrascrive il contenuto del file. Utilizzalo con cautela.<\/p><\/blockquote>\n<hr \/>\n<h3>Aggiungere dati a un file<\/h3>\n<p>Per aggiungere nuovo contenuto mantenendo quello gi\u00e0 presente si utilizza l&#8217;operatore <code>&gt;&gt;<\/code>.<\/p>\n<p>Esempio:<\/p>\n<pre><code>echo \"Hello, again\" &gt;&gt; hello.txt\r\n<\/code><\/pre>\n<p>Il testo verr\u00e0 aggiunto alla fine del file senza cancellarne il contenuto precedente.<\/p>\n<hr \/>\n<h3>Reindirizzare lo Standard Error<\/h3>\n<p>I messaggi di errore possono essere salvati separatamente utilizzando il file descriptor <strong>2<\/strong>.<\/p>\n<p>Esempio:<\/p>\n<pre><code>comando 2&gt; errors.txt\r\n<\/code><\/pre>\n<p>In questo caso:<\/p>\n<ul>\n<li>l&#8217;output normale continua ad essere visualizzato sul terminale;<\/li>\n<li>i messaggi di errore vengono salvati nel file <code>errors.txt<\/code>.<\/li>\n<\/ul>\n<hr \/>\n<h3>Reindirizzare output ed errori in file separati<\/h3>\n<p>\u00c8 possibile salvare separatamente l&#8217;output normale e gli errori.<\/p>\n<p>Esempio:<\/p>\n<pre><code>comando &gt; output.txt 2&gt; errors.txt\r\n<\/code><\/pre>\n<p>In questo modo:<\/p>\n<ul>\n<li>lo <strong>stdout<\/strong> viene salvato nel file <code>output.txt<\/code>;<\/li>\n<li>lo <strong>stderr<\/strong> viene salvato nel file <code>errors.txt<\/code>.<\/li>\n<\/ul>\n<p>Questa tecnica \u00e8 molto utilizzata negli script Bash e nelle attivit\u00e0 di troubleshooting.<\/p>\n<hr \/>\n<h3>Reindirizzare stdout e stderr nello stesso file<\/h3>\n<p>Quando si desidera salvare sia l&#8217;output normale sia gli errori nello stesso file \u00e8 possibile utilizzare:<\/p>\n<pre><code>comando &amp;&gt; combined.txt\r\n<\/code><\/pre>\n<p>In Bash questo operatore reindirizza contemporaneamente sia <code>stdout<\/code> sia <code>stderr<\/code>.<\/p>\n<blockquote><p><strong>\ud83d\udccc Da ricordare<\/strong> In molte distribuzioni Linux \u00e8 comune trovare anche la sintassi <code>comando &gt; file 2&gt;&amp;1<\/code>, che ottiene lo stesso risultato ed \u00e8 compatibile con un maggior numero di shell.<\/p><\/blockquote>\n<hr \/>\n<h3>Schema riassuntivo<\/h3>\n<table>\n<thead>\n<tr>\n<th>Operatore<\/th>\n<th>Funzione<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>&gt;<\/code><\/td>\n<td>Reindirizza lo stdout sovrascrivendo il file.<\/td>\n<\/tr>\n<tr>\n<td><code>&gt;&gt;<\/code><\/td>\n<td>Aggiunge lo stdout alla fine del file.<\/td>\n<\/tr>\n<tr>\n<td><code>2&gt;<\/code><\/td>\n<td>Reindirizza lo stderr.<\/td>\n<\/tr>\n<tr>\n<td><code>&gt; output.txt 2&gt; errors.txt<\/code><\/td>\n<td>Salva stdout e stderr in due file distinti.<\/td>\n<\/tr>\n<tr>\n<td><code>&amp;&gt; file<\/code><\/td>\n<td>Salva stdout e stderr nello stesso file (Bash).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>Best Practice<\/h3>\n<p>Quando esegui script o attivit\u00e0 di amministrazione, separa l&#8217;output normale dai messaggi di errore ogni volta che pu\u00f2 essere utile per il debugging. Utilizza invece un unico file di log quando desideri conservare tutte le informazioni prodotte dal comando.<\/p>\n<hr \/>\n<h3>Riepilogo<\/h3>\n<ul>\n<li>I reindirizzamenti modificano la destinazione dell&#8217;input e dell&#8217;output dei programmi.<\/li>\n<li><code>&gt;<\/code> salva lo stdout sovrascrivendo il file.<\/li>\n<li><code>&gt;&gt;<\/code> aggiunge lo stdout in coda al file.<\/li>\n<li><code>2&gt;<\/code> reindirizza lo stderr.<\/li>\n<li>\u00c8 possibile salvare stdout e stderr in file separati oppure nello stesso file.<\/li>\n<li>I reindirizzamenti sono uno degli strumenti fondamentali della shell Linux.<\/li>\n<\/ul>\n<h2>103.3.4 Utilizzare il comando <code>tee<\/code><\/h2>\n<p>Normalmente, quando un comando produce un output, questo viene visualizzato sul terminale oppure reindirizzato verso un file. In alcune situazioni pu\u00f2 essere utile fare entrambe le cose contemporaneamente: visualizzare il risultato sullo schermo e salvarne una copia in un file.<\/p>\n<p>Il comando <code>tee<\/code> svolge proprio questa funzione. Legge i dati dallo <strong>Standard Input (stdin)<\/strong> e li invia contemporaneamente allo <strong>Standard Output (stdout)<\/strong> e a uno o pi\u00f9 file.<\/p>\n<p>Per questo motivo si dice che <code>tee<\/code> &#8220;duplica&#8221; o &#8220;dirama&#8221; il flusso di dati.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Exam Tip<\/strong> Per l&#8217;esame LPIC-1 \u00e8 importante ricordare che <code>tee<\/code> legge i dati dallo <strong>stdin<\/strong> e li invia contemporaneamente al terminale e a uno o pi\u00f9 file.<\/p><\/blockquote>\n<hr \/>\n<h3>Utilizzo di base<\/h3>\n<p>La sintassi generale \u00e8:<\/p>\n<pre><code>comando | tee file.txt\r\n<\/code><\/pre>\n<p>Ad esempio:<\/p>\n<pre><code>echo \"Hello, World\" | tee hello.txt\r\n<\/code><\/pre>\n<p>L&#8217;output sar\u00e0:<\/p>\n<pre><code>Hello, World\r\n<\/code><\/pre>\n<p>e contemporaneamente il testo verr\u00e0 salvato nel file <code>hello.txt<\/code>.<\/p>\n<hr \/>\n<h3>Come funziona <code>tee<\/code><\/h3>\n<p>Il flusso dei dati pu\u00f2 essere rappresentato nel seguente modo:<\/p>\n<pre><code>stdin\r\n   \u2502\r\n   \u25bc\r\n  tee\r\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba Terminale (stdout)\r\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba hello.txt\r\n<\/code><\/pre>\n<p>In questo modo \u00e8 possibile monitorare l&#8217;output di un comando senza rinunciare a salvarne una copia.<\/p>\n<hr \/>\n<h3>Salvare l&#8217;output senza interrompere una pipeline<\/h3>\n<p>Uno degli utilizzi pi\u00f9 comuni di <code>tee<\/code> consiste nel salvare un risultato intermedio mantenendo attiva la pipeline.<\/p>\n<p>Ad esempio:<\/p>\n<pre><code>cat access.log | grep \"ERROR\" | tee errori.log | wc -l\r\n<\/code><\/pre>\n<p>In questo caso:<\/p>\n<ol>\n<li><code>grep<\/code> seleziona le righe contenenti <strong>ERROR<\/strong>;<\/li>\n<li><code>tee<\/code> salva tali righe nel file <code>errori.log<\/code>;<\/li>\n<li>le stesse righe vengono inviate a <code>wc -l<\/code>, che ne conta il numero.<\/li>\n<\/ol>\n<p>Senza <code>tee<\/code> sarebbe necessario eseguire il comando due volte oppure creare manualmente un file temporaneo.<\/p>\n<hr \/>\n<h3>Aggiungere dati a un file<\/h3>\n<p>Per impostazione predefinita, <code>tee<\/code> sovrascrive il file di destinazione.<\/p>\n<p>Per aggiungere il contenuto in coda si utilizza l&#8217;opzione <code>-a<\/code>.<\/p>\n<p>Esempio:<\/p>\n<pre><code>echo \"Nuova riga\" | tee -a log.txt\r\n<\/code><\/pre>\n<p>L&#8217;opzione <code>-a<\/code> (<strong>append<\/strong>) mantiene il contenuto esistente e aggiunge il nuovo testo alla fine del file.<\/p>\n<hr \/>\n<h3>Quando utilizzare <code>tee<\/code><\/h3>\n<p>Il comando <code>tee<\/code> \u00e8 particolarmente utile quando si desidera:<\/p>\n<ul>\n<li>salvare una copia dell&#8217;output di un comando;<\/li>\n<li>monitorare il risultato di una pipeline in tempo reale;<\/li>\n<li>registrare log durante l&#8217;esecuzione di script;<\/li>\n<li>evitare di eseguire due volte lo stesso comando.<\/li>\n<\/ul>\n<blockquote><p><strong>\ud83d\udccc Da ricordare<\/strong> A differenza del semplice reindirizzamento (<code>&gt;<\/code>), <code>tee<\/code> non interrompe il flusso della pipeline: l&#8217;output continua verso il comando successivo mentre viene contemporaneamente salvato nel file.<\/p><\/blockquote>\n<hr \/>\n<h3>Best Practice<\/h3>\n<p>Utilizza <code>tee<\/code> quando desideri registrare l&#8217;output di un comando mantenendolo visibile sul terminale. Nelle pipeline complesse rappresenta uno strumento molto utile per il debugging e per creare file di log senza interrompere l&#8217;elaborazione dei dati.<\/p>\n<hr \/>\n<h3>Riepilogo<\/h3>\n<ul>\n<li><code>tee<\/code> legge i dati dallo <strong>stdin<\/strong>.<\/li>\n<li>Invia contemporaneamente l&#8217;output al terminale e a uno o pi\u00f9 file.<\/li>\n<li>L&#8217;opzione <code>-a<\/code> aggiunge i dati in coda al file anzich\u00e9 sovrascriverlo.<\/li>\n<li><code>tee<\/code> permette di salvare una copia dell&#8217;output senza interrompere una pipeline.<\/li>\n<li>\u00c8 uno strumento molto utile per il logging e il debugging degli script.<\/li>\n<\/ul>\n<h2>103.3.5 Utilizzare il comando <code>xargs<\/code><\/h2>\n<p>Il comando <code>xargs<\/code> permette di trasformare i dati ricevuti dallo <strong>Standard Input (stdin)<\/strong> negli argomenti di un altro comando. In questo modo \u00e8 possibile combinare facilmente pi\u00f9 utility Linux e automatizzare operazioni su grandi quantit\u00e0 di file o dati.<\/p>\n<p><code>xargs<\/code> viene spesso utilizzato insieme a comandi come <code>find<\/code>, <code>grep<\/code> e <code>echo<\/code>, consentendo di costruire pipeline estremamente potenti.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Exam Tip<\/strong> Per l&#8217;esame LPIC-1 \u00e8 importante sapere che <code>xargs<\/code> legge i dati dallo <strong>stdin<\/strong> e li converte negli argomenti del comando specificato.<\/p><\/blockquote>\n<hr \/>\n<h3>Come funziona <code>xargs<\/code><\/h3>\n<p>La sintassi generale \u00e8:<\/p>\n<pre><code>comando | xargs altro_comando\r\n<\/code><\/pre>\n<p>L&#8217;output del primo comando viene trasformato negli argomenti del secondo comando.<\/p>\n<p>Ad esempio:<\/p>\n<pre><code>echo \"hello.txt\" | xargs rm\r\n<\/code><\/pre>\n<p>In questo caso:<\/p>\n<ol>\n<li><code>echo<\/code> invia il nome del file allo <strong>stdin<\/strong>;<\/li>\n<li><code>xargs<\/code> utilizza quel nome come argomento del comando <code>rm<\/code>;<\/li>\n<li>il file <code>hello.txt<\/code> viene eliminato.<\/li>\n<\/ol>\n<hr \/>\n<h3>Utilizzare <code>xargs<\/code> con <code>find<\/code><\/h3>\n<p>Uno degli utilizzi pi\u00f9 comuni consiste nel combinare <code>find<\/code> e <code>xargs<\/code>.<\/p>\n<p>Ad esempio:<\/p>\n<pre><code>find \/path\/to\/dir -type f -name \"*.txt\" | xargs tar -cvf backup.tar\r\n<\/code><\/pre>\n<p>Questo comando:<\/p>\n<ul>\n<li>cerca tutti i file con estensione <code>.txt<\/code>;<\/li>\n<li>passa l&#8217;elenco dei file a <code>xargs<\/code>;<\/li>\n<li>crea l&#8217;archivio <code>backup.tar<\/code> contenente tutti i file trovati.<\/li>\n<\/ul>\n<p>Questa tecnica permette di elaborare automaticamente grandi quantit\u00e0 di file.<\/p>\n<hr \/>\n<h3>Perch\u00e9 utilizzare <code>xargs<\/code>?<\/h3>\n<p><code>xargs<\/code> \u00e8 utile quando un comando produce un elenco di elementi tramite lo <strong>stdout<\/strong>, ma il comando successivo si aspetta tali elementi come argomenti.<\/p>\n<p>Ad esempio:<\/p>\n<pre><code>find . -name \"*.log\" | xargs ls -lh\r\n<\/code><\/pre>\n<p>oppure:<\/p>\n<pre><code>find . -name \"*.tmp\" | xargs rm\r\n<\/code><\/pre>\n<p>In questo modo \u00e8 possibile eseguire rapidamente la stessa operazione su numerosi file.<\/p>\n<hr \/>\n<h3>Attenzione ai nomi contenenti spazi<\/h3>\n<p>Un limite di <code>xargs<\/code> \u00e8 che, per impostazione predefinita, considera gli spazi come separatori.<\/p>\n<p>Se i nomi dei file possono contenere spazi, \u00e8 preferibile utilizzare l&#8217;opzione <code>-print0<\/code> di <code>find<\/code> insieme a <code>xargs -0<\/code>.<\/p>\n<p>Esempio:<\/p>\n<pre><code>find . -name \"*.txt\" -print0 | xargs -0 rm\r\n<\/code><\/pre>\n<p>Questa combinazione gestisce correttamente anche file con spazi o caratteri speciali nel nome.<\/p>\n<blockquote><p><strong>\ud83d\udccc Da ricordare<\/strong> La combinazione <code>find ... -print0 | xargs -0<\/code> rappresenta la soluzione pi\u00f9 sicura quando si lavora con nomi di file arbitrari.<\/p><\/blockquote>\n<hr \/>\n<h3>Best Practice<\/h3>\n<p>Utilizza <code>xargs<\/code> per automatizzare operazioni ripetitive su grandi quantit\u00e0 di file. Quando lavori con l&#8217;output di <code>find<\/code>, preferisci sempre la combinazione <code>-print0<\/code> e <code>xargs -0<\/code> per evitare problemi con nomi contenenti spazi o caratteri speciali.<\/p>\n<hr \/>\n<h3>Riepilogo<\/h3>\n<ul>\n<li><code>xargs<\/code> trasforma lo <strong>stdin<\/strong> negli argomenti di un altro comando.<\/li>\n<li>\u00c8 comunemente utilizzato insieme a <code>find<\/code>, <code>grep<\/code> ed <code>echo<\/code>.<\/li>\n<li>Permette di automatizzare operazioni su grandi quantit\u00e0 di file.<\/li>\n<li>La combinazione <code>find ... -print0 | xargs -0<\/code> \u00e8 la soluzione pi\u00f9 sicura per gestire file con spazi nel nome.<\/li>\n<li><code>xargs<\/code> \u00e8 uno degli strumenti fondamentali della shell Linux per costruire pipeline efficienti.<\/li>\n<\/ul>\n<h2>\ud83d\udcda Riepilogo della lezione<\/h2>\n<p>In questa lezione hai approfondito uno dei concetti pi\u00f9 importanti della shell Linux: la gestione dei <strong>flussi standard (stream)<\/strong>. Hai imparato come i programmi comunicano attraverso lo <strong>Standard Input (stdin)<\/strong>, lo <strong>Standard Output (stdout)<\/strong> e lo <strong>Standard Error (stderr)<\/strong>, e come utilizzare pipe e reindirizzamenti per collegare pi\u00f9 comandi tra loro.<\/p>\n<p>Hai inoltre scoperto come salvare o separare l&#8217;output dei programmi, duplicarlo con <code>tee<\/code> e trasformare i dati provenienti dallo standard input in argomenti per altri comandi mediante <code>xargs<\/code>.<\/p>\n<h3>Concetti principali<\/h3>\n<ul>\n<li>Hai compreso il ruolo dei tre stream standard: <strong>stdin<\/strong>, <strong>stdout<\/strong> e <strong>stderr<\/strong>.<\/li>\n<li>Hai imparato a reindirizzare l&#8217;output e gli errori verso file utilizzando gli operatori di reindirizzamento.<\/li>\n<li>Hai utilizzato le <strong>pipe (<code>|<\/code>)<\/strong> per creare pipeline che collegano pi\u00f9 comandi.<\/li>\n<li>Hai scoperto come il comando <code>tee<\/code> consente di visualizzare e salvare contemporaneamente l&#8217;output.<\/li>\n<li>Hai imparato a utilizzare <code>xargs<\/code> per trasformare lo standard input negli argomenti di un altro comando.<\/li>\n<li>Hai acquisito le basi per costruire pipeline efficienti e automatizzare attivit\u00e0 di amministrazione Linux.<\/li>\n<\/ul>\n<blockquote><p><strong>\ud83c\udfaf Obiettivo raggiunto<\/strong> Al termine di questa lezione sei in grado di gestire i flussi di dati della shell Linux, creare pipeline, utilizzare i principali operatori di reindirizzamento e combinare pi\u00f9 strumenti GNU\/Linux per realizzare elaborazioni complesse in modo semplice ed efficiente.<\/p><\/blockquote>\n<h3>Comandi e operatori da ricordare<\/h3>\n<table>\n<thead>\n<tr>\n<th>Comando \/ Operatore<\/th>\n<th>Descrizione<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>|<\/code><\/td>\n<td>Collega lo <strong>stdout<\/strong> di un comando allo <strong>stdin<\/strong> del comando successivo.<\/td>\n<\/tr>\n<tr>\n<td><code>&gt;<\/code><\/td>\n<td>Reindirizza lo <strong>stdout<\/strong> sovrascrivendo il file di destinazione.<\/td>\n<\/tr>\n<tr>\n<td><code>&gt;&gt;<\/code><\/td>\n<td>Aggiunge lo <strong>stdout<\/strong> alla fine di un file.<\/td>\n<\/tr>\n<tr>\n<td><code>&lt;<\/code><\/td>\n<td>Utilizza un file come <strong>stdin<\/strong>.<\/td>\n<\/tr>\n<tr>\n<td><code>2&gt;<\/code><\/td>\n<td>Reindirizza lo <strong>stderr<\/strong>.<\/td>\n<\/tr>\n<tr>\n<td><code>&gt; file 2&gt;&amp;1<\/code><\/td>\n<td>Salva stdout e stderr nello stesso file.<\/td>\n<\/tr>\n<tr>\n<td><code>tee<\/code><\/td>\n<td>Visualizza e salva contemporaneamente l&#8217;output.<\/td>\n<\/tr>\n<tr>\n<td><code>xargs<\/code><\/td>\n<td>Trasforma lo stdin negli argomenti di un altro comando.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p><strong>\ud83d\udca1 Preparazione all&#8217;esame LPIC-1<\/strong> Prima di proseguire assicurati di conoscere il ruolo di <strong>stdin<\/strong>, <strong>stdout<\/strong> e <strong>stderr<\/strong>, il funzionamento delle pipe, i principali operatori di reindirizzamento e l&#8217;utilizzo dei comandi <code>tee<\/code> e <code>xargs<\/code>. Questi concetti sono fondamentali sia per l&#8217;esame LPIC-1 sia per l&#8217;amministrazione quotidiana dei sistemi Linux.<\/p><\/blockquote>\n<hr \/>\n<h2>\u27a1\ufe0f Prossima lezione<\/h2>\n<p>Nella prossima lezione (<strong>103.4 Gestire file e directory<\/strong>) imparerai a utilizzare i principali comandi per creare, copiare, spostare, rinominare ed eliminare file e directory. Approfondirai inoltre la gestione dei collegamenti, dei permessi di base e delle operazioni pi\u00f9 comuni sul filesystem Linux.<\/p>\n<blockquote><p><strong>\ud83d\udcd6 Materiale di approfondimento<\/strong> Consulta il PDF allegato alla lezione per esercitarti con laboratori guidati, scenari realistici e quiz di autovalutazione.<\/p><\/blockquote>\n","protected":false},"comment_status":"open","ping_status":"closed","template":"","class_list":["post-3637","lesson","type-lesson","status-publish","has-post-thumbnail","hentry"],"uagb_featured_image_src":[],"uagb_author_info":{"display_name":"Rootmail Academy","author_link":"https:\/\/rootmail.it\/en\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"103.3 Utilizzare stream, pipe e reindirizzamenti Uno dei principi fondamentali dei sistemi GNU\/Linux \u00e8 la possibilit\u00e0 di far collaborare pi\u00f9 programmi attraverso lo scambio di dati. Ogni comando pu\u00f2 ricevere informazioni in ingresso, elaborarle e produrre un risultato che pu\u00f2 essere visualizzato sullo schermo, salvato in un file oppure utilizzato direttamente da un altro comando.&hellip;","_links":{"self":[{"href":"https:\/\/rootmail.it\/en\/wp-json\/wp\/v2\/lesson\/3637","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rootmail.it\/en\/wp-json\/wp\/v2\/lesson"}],"about":[{"href":"https:\/\/rootmail.it\/en\/wp-json\/wp\/v2\/types\/lesson"}],"replies":[{"embeddable":true,"href":"https:\/\/rootmail.it\/en\/wp-json\/wp\/v2\/comments?post=3637"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rootmail.it\/en\/wp-json\/wp\/v2\/media\/3675"}],"wp:attachment":[{"href":"https:\/\/rootmail.it\/en\/wp-json\/wp\/v2\/media?parent=3637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}