
⏱️ Tempo stimato di lettura: 15 minuti
🧩 Difficoltà: Intermedio
🎯 Obiettivi specifici:
- Comprendere le redirezioni avanzate di input/output.
- Utilizzare pipe in combinazioni complesse.
- Imparare a gestire stderr e stdout separatamente.
- Utilizzare costrutti come process substitution e tee.
Redirezioni e pipe avanzate in BASH
Le redirezioni e pipe avanzate sono strumenti potenti che permettono di manipolare il flusso di dati tra comandi. In questa lezione scopriremo come andare oltre la semplice pipe (|) o redirezione (>), per costruire pipeline robuste e personalizzate.
🔄 Teoria: redirezioni complesse
Nel mondo BASH, ogni processo ha accesso a tre flussi:
- stdin (0): input standard
- stdout (1): output standard
- stderr (2): output di errore
Ecco alcune redirezioni avanzate:
command > file 2>&1→ redirige sia stdout che stderr su un filecommand 2> error.log→ stderr viene salvato separatamentecommand > output.log 2> error.log→ separa stdout e stderr in due file diversicommand &> all.log→ redirige tutto (shorthand per> all.log 2>&1)
Per ulteriori dettagli consulta la documentazione ufficiale di GNU Bash sulle redirezioni.
🔁 Pipe avanzate
La pipe standard (|) prende l’output di un comando e lo passa all’input del successivo. Ma possiamo:
- Usare
teeper duplicare l’output:command | tee log.txt | another_command - Usare
|&per passare sia stdout che stderr:command |& grep error - Combinare pipe multiple:
cmd1 | cmd2 | cmd3
🔄 Process substitution
Una delle tecniche più avanzate è la sostituzione di processo:
diff <(ls dir1) <(ls dir2)
Il comando diff confronta direttamente l’output di due comandi.
🔶 Esempio pratico
Supponiamo di voler controllare un log e filtrare gli errori:
grep -i error app.log | tee errori.log | wc -l
Questo comando:
- cerca la parola “error” (case insensitive) in
app.log - scrive il risultato in
errori.log - conta quante righe contengono errori
📚 Glossario tecnico
- stderr: Flusso di output per i messaggi di errore.
- tee: Comando che duplica l’output.
- process substitution: Tecnica per passare output come file temporanei ai comandi.
📝 Esercizio finale
Scrivi un comando che:
- Legga un file
input.txt - Filtri le righe contenenti la parola “fail”
- Salvi l’output in
failures.log - Conti quante righe contengono “fail” e stampi il numero
🧠 Quiz finale
Domanda: Qual è il significato di 2>&1 in una redirezione?
A) Redirige stdout su stderr
B) Redirige stderr su stdout
C) Redirige entrambi su un file
D) Nessuna delle precedenti
Risposta corretta: B
❓ FAQ
1. Posso redirigere stderr su un file e stdout su un altro?
Sì, usa command > out.log 2> err.log
2. Cosa fa |&?
Passa sia stdout che stderr nella pipe successiva.
3. tee sovrascrive o aggiunge al file?
Di default sovrascrive, ma con -a aggiunge.
4. Posso usare pipe dentro uno script?
Certo, pipe e redirezioni funzionano anche negli script.
5. diff <(cmd1) <(cmd2) funziona sempre?
Funziona se il comando supporta file come input.
🔁 Collegamento alla lezione successiva
🔷 Lezione 12/24: Variabili d’ambiente e personalizzazione Bash
📢 Hai dubbi su redirezioni o pipe? Scrivilo nei commenti!
🔗 Link interno
🔟 Gestire processi e background con Bash su Linux