Odpowiedzi:
Skrypt odczytuje pary ciągów z dwóch plików. W każdej iteracji, odczytuje ciąg od file11
INTO lineA
, a od file22
do lineB
. Robi to do momentu napotkania końca któregoś z plików. Treść pętli wyprowadza dwa ciągi i pustą linię.
Te <file11
środki „Połącz / przekierowania standardowe wejście z file11
w poleceniu”, gdzie „w tym polecenie” jest while
pętla. Można to również napisać 0<file11
.
Standardowym wejściem jest deskryptor pliku numer 0. Deskryptory plików 1 i 2 są zarezerwowane dla standardowych strumieni wyjściowych i standardowych błędów.
Te 3<file22
środki „connect pliku deskryptora 3 do file22
tego polecenia.” Liczba 3 to kolejny „wolny” numer deskryptora pliku, ale kod mógł zamiast tego użyć 4 lub 5 lub dowolnej małej liczby całkowitej innej niż 0, 1 i 2 (limit możliwych do użycia numerów deskryptorów plików zależy od tego, która powłoka jest używane, ale gwarantują, że liczby do 9 będą działać).
W pętli read lineA
domyślnie odczytuje ciąg ze standardowego wejścia, tj. Z pliku file11
(standardowe wejście jest dziedziczone z pętli). Można to również napisać read lineA <&0
.
Za read lineB <&3
pomocą read
polecenia odczytuje się z deskryptora pliku 3, tj. Z file22
, zamiast ze standardowego wejścia (deskryptor pliku 3 jest dostępny w pętli, podobnie jak standardowe wejście).
Krótko mówiąc, używa standardowego strumienia wejściowego i „dodatkowego” deskryptora pliku (numer 3) do odczytu z dwóch plików „jednocześnie” (ciąg po kolei z każdego pliku z kolei). Zwykle jeden ma dostęp tylko do jednego strumienia wejściowego, ale omija to ograniczenie, jawnie tworząc drugi strumień wejściowy i łącząc go z file22
plikiem.
Związane z:
Używam słowa „ciąg” powyżej zamiast „linii”. Rzeczy odczytane z tych dwóch plików będą pozbawione flankujących białych znaków, a niektóre sekwencje specjalne będą interpretowane specjalnie.
Aby odczytać linię za pomocą read
, użyj
IFS= read -r varname
Związane z:
3<file22
jest to miejsce, w fopen
którym FID
nie jest zwracane, ale z góry określone?
fdopen()
. Tak.