Ich habe diese Zeile in einem Skript gesehen:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
Was ist
3>&1 1>&2 2>&3
tun? Ich weiß, dass 1 = stdout und 2 = stderr, aber was ist das 3
und das &
für?
Antworten:
Die Zahlen sind Dateideskriptoren und nur die ersten drei (beginnend mit Null) haben eine standardisierte Bedeutung:
Jede dieser Zahlen in Ihrem Befehl bezieht sich auf einen Dateideskriptor. Sie können einen Dateideskriptor entweder mit in eine Datei
>
umleiten oder mit in einen anderen Dateideskriptor umleiten>&
Der
3>&1
in Ihrer Kommandozeile wird einen neuen Dateideskriptor erstellen und umleiten, zu1
welchemSTDOUT
. Leiten Sie1>&2
nun den Dateideskriptor 1 nachSTDERR
und2>&3
den Dateideskriptor 2 nach 3 umSTDOUT
.Also im Grunde haben Sie gewechselt
STDOUT
undSTDERR
, das sind die Schritte:Wenn das Programm nun etwas zum Dateideskriptor 1 druckt, wird es zum Dateideskriptor 2 und umgekehrt gedruckt.
quelle
Es tauscht
stdout
undstderr
.>name
bedeutet, dass die Ausgabe in eine Datei umgeleitet wirdname
.>&number
bedeutet, dass die Ausgabe an den Dateideskriptor umgeleitet wirdnumber
.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, die1
Standardausgabe oder den2
Standardfehler. Sie können auch eine beliebige andere Zahl verwenden, die einen neuen Dateideskriptor erstellt, genau wie beim Erstellen einer neuen Variablen mitvar=value
.Standardmäßig werden sowohl Dateideskriptor
1
als auch2
Gehe zu ausgeführt/dev/tty
. Wenn Sie alsosomecommand 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 ichVielleicht möchte die Person, die das Skript geschrieben hat,, dass
dialog
die Ausgabestdout
statt ausstderr
irgendeinem Grund an sie gesendet wird.Siehe auch Reihenfolge der Weiterleitungen
quelle
Der Drehbuchautor definierte fd 3 wie folgt:
Öffnen Sie "File.txt" und weisen Sie ihm fd 3 zu. Maximale Dateideskriptoren: 255
Nur 4 Zeichen lesen.
Schreiben Sie dort einen Dezimalpunkt.
Schließen Sie fd 3.
==> 1234.67890
quelle