Odpowiedzi:
Skrypt odczytuje pary ciągów z dwóch plików. W każdej iteracji, odczytuje ciąg od file11INTO lineA, a od file22do 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 file11w poleceniu”, gdzie „w tym polecenie” jest whilepę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 file22tego 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 lineAdomyś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 <&3pomocą readpolecenia 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 file22plikiem.
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<file22jest to miejsce, w fopenktórym FIDnie jest zwracane, ale z góry określone?
fdopen(). Tak.