GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bedeutung von Pfeilsymbolen beim Duplizieren/Schließen von Dateideskriptoren unter Bash?

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 ).

Verwandte:Wie kann man Firefox mitteilen, ein anderes ALSA-Gerät zu verwenden?

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

Linux
  1. Weitere dumme Bash-Tricks:Variablen, Suchen, Dateideskriptoren und Remote-Operationen

  2. Die Bash‘?

  3. Durchführen von atomaren Schreibvorgängen in einer Datei in Bash?

  4. Wie parse ich eine CSV-Datei in Bash?

  5. Threads und Dateideskriptoren

Bash:An Datei anhängen

So leiten Sie stderr in Bash auf stdout um

Ersetzen von Zeichenfolgen in Bash

35 Bash-Skriptbeispiele

Bash-Skripting – Bedingte Anweisungen

Bash-Scripting(III)