Es tauscht stdoutund stderr.
>namebedeutet, dass die Ausgabe in eine Datei umgeleitet wird name.
>&numberbedeutet, 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 0auf die Standardeingabe, die 1Standardausgabe oder den 2Standardfehler. 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 1als auch 2Gehe zu ausgeführt /dev/tty. Wenn Sie also somecommand 3>&1 1>&2 2>&3eine 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 dialogdie Ausgabe stdoutstatt aus stderrirgendeinem Grund an sie gesendet wird.
Siehe auch Reihenfolge der Weiterleitungen