Cosa fa#
Ogni processo Unix apre automaticamente tre canali di comunicazione identificati dai numeri 0, 1 e 2. La shell permette di redirigere questi canali con > e 2>&1. Capirli e' indispensabile per usare pipe e grep su output di tool che scrivono su stderr.
TL;DR#
Tre file descriptor aperti di default in ogni processo:
0= stdin — input (tastiera o pipe in entrata)1= stdout — output normale (terminale o pipe)2= stderr — errori e messaggi diagnostici (terminale, scavalca la pipe)
| passa solo stdout. stderr va diretto al terminale — grep non lo vede.
comando 2>&1 | grep "pattern" # unisce stderr e stdout prima del grepI tre file descriptor#
| FD | Nome | Destinazione default |
|---|---|---|
0 | stdin | tastiera |
1 | stdout | terminale |
2 | stderr | terminale |
Sono file descriptor come gli altri — numeri interi assegnati dal kernel. La shell li gestisce prima di eseguire il comando.
Redirezione#
> redirige stdout su file:
comando > output.txt # stdout su file, stderr al terminale
comando >> output.txt # append invece di sovrascrivere2> redirige stderr — il numero a sinistra di > e' sempre un fd:
comando 2> errori.txt # stderr su file, stdout al terminale
comando 2>/dev/null # scarta tutti gli errori2>&1 redirige stderr su stdout — li unisce nello stesso flusso:
comando 2>&1 | grep "pattern" # stderr e stdout insieme nel grepRegola del parser shell#
A sinistra di > un numero e' sempre interpretato come file descriptor — non serve &.
A destra di > il default e' "nome file". Per indicare un fd serve &:
2>1 # scrive su un file chiamato "1"
2>&1 # redirige fd 2 su fd 1 (stdout)& disambigua: "questo e' un file descriptor, non un nome file".
Perche' alcuni tool scrivono su stderr#
Non esiste uno standard universale — dipende dal programma. Non lo sai finche' non provi. Se un grep su output di un tool non trova nulla ma sai che dovrebbe trovare qualcosa, il problema e' quasi sempre stderr.
Pattern diagnostico:
# prova prima cosi'
tool | grep "pattern"
# se non trova nulla, prova cosi'
tool 2>&1 | grep "pattern"Esempio concreto: tshark -z help scrive su stderr. Per filtrare le statistiche HTTP disponibili:
tshark -z help 2>&1 | grep -i "http"Scenario Reale#
Un analista cerca una statistica specifica in tshark. tshark -z help | grep -i dns non trova nulla perche' l'help va su stderr — grep vede solo stdout vuoto. Aggiungendo 2>&1 il flusso si unisce e grep trova i risultati.
Pattern generale: ogni volta che un tool sembra non produrre output dove te lo aspetti, verifica su quale fd sta scrivendo.


