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
shell
io-redirection
read
Gaurav
quelle
quelle
Antworten:
Das Skript liest Zeichenfolgenpaare aus zwei Dateien. In jeder Iteration wird eine Zeichenfolge von
file11
inlineA
und vonfile22
in gelesenlineB
. 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 vonfile11
in diesen Befehl", wobei "dieser Befehl" diewhile
Schleife ist. Dies könnte auch geschrieben worden sein0<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 mitfile22
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 Dateifile11
(die Standardeingabe wird von der Schleife übernommen). Dies könnte auch geschrieben worden seinread lineA <&0
.Mit liest
read lineB <&3
derread
Befehl aus dem Dateideskriptor 3, dh aus derfile22
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 SieVerbunden:
quelle
3<file22
wie eine ist ,fopen
wo dasFID
nicht , aber im Voraus festgelegten zurückgegeben wird?fdopen()
. Ja.