Wie funktionieren Dateideskriptoren?
Kann jemand mir sagen, warum dies nicht funktioniert? Ich bin Herumspielen mit Datei-Deskriptoren, aber fühle mich ein wenig verloren.
#!/bin/bash
echo "This"
echo "is" >&2
echo "a" >&3
echo "test." >&4
Den ersten drei Zeilen laufen, in Ordnung, aber die letzten beiden Fehler aus. Warum?
InformationsquelleAutor der Frage Trcx | 2011-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
File-Deskriptoren 0, 1 und 2 sind für stdin, stdout und stderr, bzw..
Dateideskriptoren 3, 4, .. 9 sind für zusätzliche Dateien. Um Sie zu nutzen, müssen Sie diese vorher geöffnet werden. Zum Beispiel:
Für mehr Informationen werfen Sie einen Blick auf Advanced Bash-Scripting Guide: Kapitel 20. I/O-Umleitung.
InformationsquelleAutor der Antwort dogbane
Es ist eine alte Frage, aber eine Sache Bedarf noch der Klärung.
Während die Antworten von Carl Norum und dogbane korrekt sind, ist die Annahme zu ändern Sie Ihr Skript, um es Arbeit.
Was ich möchte darauf hinweisen, dass Sie nicht brauchen, um das Skript ändern,:
Es funktioniert, wenn Sie es aufrufen, anders:
was bedeutet, dass die Umleitung Dateideskriptoren 3 und 4 zu 1 (das ist die standard-Ausgabe).
Der Punkt ist, dass das script ist vollkommen in Ordnung in dem Wunsch, zu schreiben, um die Deskriptoren können als nur 1 und 2 (stdout und stderr) wenn diese Deskriptoren werden von der übergeordneten Prozess.
Dein Beispiel ist eigentlich ganz interessant, weil dieses Skript schreiben können, um 4 unterschiedliche Dateien:
Nun haben Sie die Ausgabe in 4 separate Dateien:
Was ist interessanter ist, dass Ihr Programm nicht haben, um die Schreibberechtigung für diese Dateien, da es nicht wirklich öffnen.
Zum Beispiel, wenn ich
sudo -s
zu ändern, Benutzer zu root, erstellen Sie ein Verzeichnis als root an, und führen Sie den folgenden Befehl als mein normaler Benutzer (bzw in meinem Fall) wie folgt:Bekomme ich eine Fehlermeldung:
Aber wenn ich die Umleitung außerhalb von
su
:(beachten Sie den Unterschied in Anführungszeichen) es funktioniert und ich bekomme:
sind 4 Dateien, die im Besitz von root in ein Verzeichnis im Besitz von root - auch wenn das script nicht über die Berechtigungen zum erstellen dieser Dateien.
Ein weiteres Beispiel wäre die Verwendung von chroot-Gefängnis oder ein container und ein Programm ausführen im inneren, wo es hätte nicht auf diese Dateien zugreifen, auch wenn es als root laufen und trotzdem umleiten diejenigen Deskriptoren außen, wo Sie brauchen, ohne tatsächlich Zugriff auf das gesamte file-system oder irgendetwas anderes zu diesem Skript.
Der Punkt ist, dass Sie haben entdeckt, ein sehr interessanter und nützlicher Mechanismus. Sie müssen nicht zu öffnen, alle Dateien in Ihrem Skript, wie vorgeschlagen wurde, in anderen Antworten. Manchmal ist es nützlich, lenken Sie während der Skript-Aufruf.
Um es zusammenzufassendiese:
ist eigentlich äquivalent zu:
ausführen des Programms:
ist das gleiche wie:
Die Nummer 1 ist einfach nur ein Standard-Zahl, und es ist stdout.
Aber auch dieses Programm:
kann produzieren ein "Bad descriptor" Fehler. Wie? Bei der Ausführung als:
Ist die Ausgabe:
Hinzufügen
>&-
(das ist das gleiche wie1>&-
) bedeutet die Schließung der standard-Ausgabe. Hinzufügen2>&-
würde bedeuten, schließen die stderr.Können Sie selbst tun eine etwas komplizierte Sache. Ihre ursprüngliche Drehbuch:
beim ausführen mit nur:
Drucke:
Aber Sie können Deskriptoren 3 und 4 funktionieren, aber die Nummer 1 scheitern, indem Sie Folgendes ausführen:
It-Ausgänge:
Wenn Sie wollen-Deskriptoren 1 und 2 fehlschlagen, führen Sie es wie folgt:
Erhalten Sie:
Warum? Nicht alles, was scheitern? Es hat aber ohne stderr (file descriptor Nummer 2) Sie nicht sehen, die Fehler Meldungen!!!
Ich denke, es ist sehr nützlich, zu Experimentieren, auf diese Weise zu erhalten ein Gefühl von wie die Deskriptoren und Ihre Umleitung arbeiten.
Dein script ist ein sehr Interessantes Beispiel in der Tat - und ich behaupte, dass es ist nicht gebrochen, Sie waren nur mit es falsch! 🙂
InformationsquelleAutor der Antwort rsp
Es fehlschlägt, weil diese Datei-Deskriptoren, nicht Punkt-zu nichts! Die normale Standard-file-Deskriptoren sind die standard-Eingabe
0
die standard-Ausgabe1
und die standard-Fehler-stream2
. Da Ihr Skript nicht öffnen andere Dateien, es gibt keine anderen gültigen Datei-Deskriptoren. Sie können eine Datei öffnen, in der bash mitexec
. Hier ist eine änderung Ihrer Beispiel:"Und jetzt werden wir es:
Wie Sie sehen können, die extra-Ausgabe gesendet wurde, um die angeforderten Dateien.
InformationsquelleAutor der Antwort Carl Norum