Was ist die Bedeutung von "<& 3" und "done <file11 3 <file22"


16

Ich habe das folgende Skript:

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

Dieser Code funktioniert gut. Aber ich verstehe das nicht:

  • <&3
  • done < file11 3< file22

1
Können Sie uns erklären, was das Drehbuch bedeutet? (Sie sagen, es funktioniert gut)
Mathieu

Antworten:


22

Das Skript liest Zeichenfolgenpaare aus zwei Dateien. In jeder Iteration wird eine Zeichenfolge von file11in lineAund von file22in gelesen lineB. Dies geschieht so lange, bis das Ende einer der beiden Dateien erreicht ist. Der Körper der Schleife gibt die beiden Zeichenfolgen und eine Leerzeile aus.

Das <file11bedeutet "Standardeingabe verbinden / umleiten von file11in diesen Befehl", wobei "dieser Befehl" die whileSchleife ist. Dies könnte auch geschrieben worden sein 0<file11.

Die Standardeingabe ist die Dateideskriptornummer 0. Die Dateideskriptoren 1 und 2 sind für die Standardausgabe und die Standardfehlerströme reserviert.

Das 3<file22bedeutet "verbinde Dateideskriptor 3 mit file22für diesen Befehl". Die Nummer 3 ist zufällig die nächste "freie" Dateideskriptornummer, aber der Code könnte stattdessen 4 oder 5 oder eine andere kleine Ganzzahl als 0, 1 und 2 verwenden (die Grenze der verwendbaren Dateideskriptornummern hängt davon ab, welche Shell verwendet wird verwendet werden, aber Zahlen bis zu 9 funktionieren garantiert).

Liest in der Schleife read lineAstandardmäßig eine Zeichenfolge aus der Standardeingabe, dh aus der Datei file11(die Standardeingabe wird von der Schleife übernommen). Dies könnte auch geschrieben worden sein read lineA <&0.

Mit liest read lineB <&3der readBefehl aus dem Dateideskriptor 3, dh aus der file22Standardeingabe (Dateideskriptor 3 ist in der Schleife verfügbar, genau wie die Standardeingabe).

Kurz gesagt, es verwendet den Standardeingabestream und einen "zusätzlichen" Dateideskriptor (Nummer 3), um "gleichzeitig" aus zwei Dateien zu lesen (jeweils eine Zeichenfolge aus jeder Datei). Normalerweise hat man nur Zugriff auf einen Eingabestream, dies umgeht jedoch diese Einschränkung, indem explizit ein zweiter Eingabestream erstellt und mit der file22Datei verbunden wird.

Verbunden:


Ich benutze das Wort "Zeichenfolge" oben und nicht "Zeile". Bei den Dingen, die aus den beiden Dateien gelesen werden, werden flankierende Leerzeichen entfernt, und bestimmte Escape-Sequenzen werden speziell interpretiert.

Um eine Zeile mit zu lesen read, verwenden Sie

IFS= read -r varname

Verbunden:


Gute Antwort! Was ich nicht verstehe, ist, wie Dateideskriptor 3 verwendet werden kann. Bedeutet dies , dass als 3<file22wie eine ist , fopenwo das FIDnicht , aber im Voraus festgelegten zurückgegeben wird?
A. Donda

2
@ A.Donda Du beschreibst fdopen(). Ja.
Kusalananda
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.