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
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
Antworten:
Das Skript liest Zeichenfolgenpaare aus zwei Dateien. In jeder Iteration wird eine Zeichenfolge von file11
in lineA
und von file22
in 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 <file11
bedeutet "Standardeingabe verbinden / umleiten von file11
in diesen Befehl", wobei "dieser Befehl" die while
Schleife 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<file22
bedeutet "verbinde Dateideskriptor 3 mit file22
fü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 lineA
standardmäß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 <&3
der read
Befehl aus dem Dateideskriptor 3, dh aus der file22
Standardeingabe (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 file22
Datei 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:
3<file22
wie eine ist , fopen
wo das FID
nicht , aber im Voraus festgelegten zurückgegeben wird?
fdopen()
. Ja.