A volte vuoi reindirizzare sia stdout che stderr nella stessa posizione, Questo è quando >&
viene usato - punta un descrittore di file a un altro.
Ad esempio, se si desidera scrivere sia stdout che stderr nello stesso file (sia esso /dev/null
o output.txt
), è possibile reindirizzarli separatamente, con
app 1>/dev/null 2>/dev/null
oppure puoi reindirizzare un descrittore di file al file e l'altro descrittore di file nel primo:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
Nel primo esempio, 2>&1
indica il descrittore di file n. 2 verso il punto 1 già indicato. Il secondo esempio ottiene lo stesso, iniziando invece con stderr.
Come altro esempio, ci sono casi in cui stdout (descrittore di file n. 1) punta già alla posizione desiderata, ma non è possibile fare riferimento ad essa per nome (può essere associato a una pipe, un socket o simili). Ciò si verifica spesso quando si utilizza l'espansione del processo (gli operatori ` `
o $( )
), che normalmente acquisisce solo stdout, ma è possibile includere in esso stderr. In questo caso, useresti anche >&
per indicare stderr a stdout:
out=$(app 2>&1)
Un altro esempio comune è un cercapersone o grep
un'utilità simile, poiché la pipe funziona |
normalmente solo su stdout, reindirizzare stderr a stdout prima di usare la pipe:
app 2>&1 | grep hello
Come sapere quale di 2>&1
o 1>&2
è corretto? Il descrittore di file già impostato va a destra >&
e il descrittore di file che si desidera reindirizzare va a sinistra. ( 2>&1
significa "punta il descrittore di file n. 2 al descrittore di file n. 1").
Alcune shell hanno scorciatoie per reindirizzamenti comuni; ecco alcuni esempi da Bash:
app 1>/dev/null 2>&1
avrebbe significato che 2> & 1 avrebbero indicato il file a cui 1 stava già reindirizzando. Presumo che potrei fare altrettanto facilmenteapp > /dev/null &>
?