Es tauscht stdout
und stderr
.
>name
bedeutet, dass die Ausgabe in eine Datei umgeleitet wird name
.
>&number
bedeutet, dass die Ausgabe an den Dateideskriptor umgeleitet wird number
.
Das &
wird also benötigt, um der Shell mitzuteilen, dass Sie einen Dateideskriptor und keinen Dateinamen meinen.
Ein Dateideskriptor ist eine Zahl, die auf eine bereits geöffnete Datei verweist. Die Standardeingaben beziehen sich 0
auf die Standardeingabe, die 1
Standardausgabe oder den 2
Standardfehler. Sie können auch eine beliebige andere Zahl verwenden, die einen neuen Dateideskriptor erstellt, genau wie beim Erstellen einer neuen Variablen mit var=value
.
Standardmäßig werden sowohl Dateideskriptor 1
als auch 2
Gehe zu ausgeführt /dev/tty
. Wenn Sie also somecommand 3>&1 1>&2 2>&3
eine neue Shell ausführen , ändert sich nichts (außer Sie haben jetzt einen Dateideskriptor mit der Nummer 3).
Aber wenn es irgendwo früher im Skript eine Umleitung mit exec (zB exec 2>error.log
) ausführt oder das Skript mit einer Befehlszeile einschließlich Umleitung (zB ./thescript 2>error.log
) ausgeführt wird, dann werden stdout und stderr ausgetauscht.
In Ihrem speziellen Fall ist der Befehl, der seine stdout und stderr getauscht hat das ist dialog
. Wenn ich auf die Manpage schaue , sehe ich
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
Vielleicht möchte die Person, die das Skript geschrieben hat,, dass dialog
die Ausgabe stdout
statt aus stderr
irgendeinem Grund an sie gesendet wird.
Siehe auch Reihenfolge der Weiterleitungen