Co oznaczają „<& 3” i „done <plik 11 3 <plik 22”


16

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

1
Czy możesz nam wyjaśnić, co robi skrypt? (Mówisz, że działa dobrze)
Mathieu

Odpowiedzi:


22

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:


Dobra odpowiedź! Nie rozumiem, jak można używać deskryptora pliku 3. Czy to oznacza, że ​​nie 3<file22jest to miejsce, w fopenktórym FIDnie jest zwracane, ale z góry określone?
A. Donda

2
@ A.Donda Opisujesz fdopen(). Tak.
Kusalananda
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.