Mam następujący skrypt:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Ten kod działa dobrze. Ale nie rozumiem tych:
<&3
done < file11 3< file22
shell
io-redirection
read
Gauraw
źródło
źródło
Odpowiedzi:
Skrypt odczytuje pary ciągów z dwóch plików. W każdej iteracji, odczytuje ciąg od
file11
INTOlineA
, a odfile22
dolineB
. 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 zfile11
w poleceniu”, gdzie „w tym polecenie” jestwhile
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 dofile22
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 plikufile11
(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. Zfile22
, 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żyjZwiązane z:
źródło
3<file22
jest to miejsce, wfopen
którymFID
nie jest zwracane, ale z góry określone?fdopen()
. Tak.