Ich lese ein Buch über die Linux-Befehlszeile, in dem der Autor die Konventionen im Bash-Handbuch in Bezug auf Pfeilsymbole, die bei Umleitungsvorgängen verwendet werden, nicht zu befolgen scheint. Er verwendet nämlich immer den linken Pfeil <
beim Duplizieren und Schließen von Dateideskriptoren, unabhängig davon, ob die Deskriptoren Eingabe- oder Ausgabedeskriptoren sind.
Hier ist ein Beispiel:
exec 3<&0 4<&1 #shouldn't be 4>&1 ?
#...
exec 3<&- 4<&- #shouldn't be 4>&- ?
Die Bash-Manpage ist in diesem Punkt vage, demnach haben die Deskriptoren zum Duplizieren/Schließen und Verschieben von Dateien die folgende Syntax:
#Duplicating and closing (in case word expands to -):
[n]<&word
[n]>&word
#Moving:
[n]<&digit-
[n]>&digit-
Es wird beschrieben, dass sie nur dann ein anderes Verhalten haben, wenn wir den n
nicht explizit angeben . Aber wenn wir das tun, bedeutet das, dass wir diese Formen austauschbar verwenden können?
Akzeptierte Antwort:
Es spielt keine Rolle, da sowohl 4>&1
und 4<&1
machen Sie dasselbe:dup2(1, 4)
Dies ist der Systemaufruf, um ein fd auf ein anderes zu duplizieren. Der duplizierte fd erbt automatisch die E/A-Richtung des ursprünglichen fd. (dasselbe gilt für 4>&-
vs 4<&-
die beide zu close(4)
aufgelöst werden , und 4>&1-
das ist der dup2(1, 4)
gefolgt von close(1)
).
Allerdings ist die 4<&1
Syntax ist verwirrend, es sei denn, fd 1 war aus irgendeinem Grund explizit zum Lesen geöffnet (was noch verwirrender wäre), sollte meiner Meinung nach also vermieden werden.
Der duplizierte fd
teilt dieselbe offene Dateibeschreibung was bedeutet, dass sie denselben Offset in der Datei (für die Dateitypen, wo es sinnvoll ist) und dieselben zugeordneten Flags (E/A-Umleitung/Öffnungsmodus, O_APPEND usw.) teilen.
Unter Linux gibt es eine andere Möglichkeit zum Duplizieren ein fd
(was nicht wirklich eine Duplizierung ist) und eine neue Dateibeschreibung öffnen erstellen für dieselbe Ressource, aber mit möglicherweise unterschiedlichen Flags.
exec 3> /dev/fd/4
Unter Solaris und wahrscheinlich den meisten anderen Unices entspricht dies mehr oder weniger dup2(4, 3)
, unter Linux, das die gleiche Ressource öffnet, auf die der fd 4 von Grund auf zeigt.
Das ist ein wichtiger Unterschied, denn für eine normale Datei ist beispielsweise der Offset von fd 3 0 (der Anfang der Datei) und die Datei wird abgeschnitten (weshalb Sie beispielsweise unter Linux tee -a /dev/stderr
statt tee /dev/stderr
).
Und der E/A-Modus kann unterschiedlich sein.
Interessanterweise zeigt fd 4, wenn fd 4 auf das lesende Ende einer Pipe zeigt, nun fd 3 auf das schreibende Ende (/dev/fd/3
verhält sich wie eine named pipe ):
$ echo a+a | { echo a-a > /dev/fd/0; tr a b; }
b+b
b-b
$ echo a+a | { echo a-a >&0; tr a b; }
bash: echo: write error: Bad file descriptor
b+b