Manchmal möchten Sie sowohl stdout als auch stderr an denselben Speicherort umleiten. In diesem Fall >&
wird ein Dateideskriptor auf einen anderen verwiesen.
Wenn Sie beispielsweise sowohl stdout als auch stderr in dieselbe Datei schreiben möchten (sei es /dev/null
oder output.txt
), können Sie sie separat mit umleiten
app 1>/dev/null 2>/dev/null
Oder Sie können einen Dateideskriptor in die Datei umleiten und den anderen in den ersten:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
Im ersten Beispiel 2>&1
zeigt der Dateideskriptor Nr. 2 auf die Stelle, auf die Nr. 1 bereits zeigt. Das zweite Beispiel erreicht dasselbe, indem es stattdessen mit stderr beginnt.
Als weiteres Beispiel gibt es Fälle, in denen stdout (Dateideskriptor Nr. 1) bereits auf den gewünschten Speicherort verweist, Sie jedoch nicht namentlich darauf verweisen können (dies kann mit einer Pipe, einem Socket oder dergleichen verbunden sein). Dies ist häufig der Fall, wenn Sie die Prozesserweiterung (die Operatoren ` `
oder $( )
) verwenden, mit der normalerweise nur stdout erfasst wird. Möglicherweise möchten Sie jedoch stderr einbeziehen. In diesem Fall würden Sie auch >&
stderr auf stdout zeigen:
out=$(app 2>&1)
Ein weiteres häufiges Beispiel ist ein Pager grep
oder ein ähnliches Dienstprogramm. Da die Pipe |
normalerweise nur auf stdout funktioniert, würden Sie stderr vor der Verwendung der Pipe auf stdout umleiten:
app 2>&1 | grep hello
Wie kann man wissen, von welchem 2>&1
oder 1>&2
was richtig ist? Der bereits eingerichtete Dateideskriptor befindet sich rechts von >&
und der Dateideskriptor, den Sie umleiten möchten, befindet sich links von. ( 2>&1
bedeutet "Punktdateideskriptor # 2 bis Dateideskriptor # 1".)
Einige Shells verfügen über Verknüpfungen für allgemeine Umleitungen. Hier sind Beispiele von Bash:
1>
kann auf gerade gekürzt werden >
1>foo 2>&1
zu >&foo
oder&>foo
2>&1 | program
zu |& program
app 1>/dev/null 2>&1
bedeuten würde, dass 2> & 1 auf die Datei verweisen würde, zu der 1 bereits umgeleitet hat. Ich nehme an, ich könnte es genauso leicht tunapp > /dev/null &>
?