ความหมายของ“ <& 3” และ“ Done <file11 3 <file22” คืออะไร


16

ฉันมีสคริปต์ต่อไปนี้:

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

รหัสนี้ใช้งานได้ดี แต่ฉันไม่เข้าใจสิ่งเหล่านี้:

  • <&3
  • done < file11 3< file22

1
คุณช่วยอธิบายให้เราฟังได้ไหมสคริปต์ (คุณบอกว่ามันใช้งานได้ดี)
Mathieu

คำตอบ:


22

สคริปต์อ่านสตริงคู่จากสองไฟล์ ในแต่ละซ้ำมันอ่านสตริงจากfile11เข้ามาlineAและจากการเข้าfile22 lineBมันทำเช่นนี้จนกว่าจะพบจุดสิ้นสุดของไฟล์ใดไฟล์หนึ่ง เนื้อความของลูปส่งเอาต์พุตสองสตริงและบรรทัดว่าง

<file11หมายถึง "การเชื่อมต่อ / เปลี่ยนเส้นทางเข้ามาตรฐานจากfile11เข้าไปในคำสั่งนี้" ที่ "คำสั่งนี้" เป็นwhileห่วง 0<file11นอกจากนี้ยังอาจได้รับการเขียน

อินพุตมาตรฐานคือหมายเลขอธิบายไฟล์ 0 ตัวอธิบายไฟล์ 1 และ 2 ถูกสงวนไว้สำหรับเอาต์พุตมาตรฐานและสตรีมข้อผิดพลาดมาตรฐาน

3<file22หมายถึง "การเชื่อมต่อไฟล์อธิบาย 3 file22สำหรับคำสั่งนี้" หมายเลข 3 เกิดขึ้นเป็นหมายเลขตัวอธิบายไฟล์ "ฟรี" ตัวถัดไป แต่โค้ดสามารถใช้ 4 หรือ 5 หรือจำนวนเต็มขนาดเล็กอื่น ๆ ที่ไม่ใช่ 0, 1 และ 2 แทน (ขีด จำกัด ของหมายเลขตัวอธิบายไฟล์ที่ใช้งานได้ขึ้นอยู่กับเชลล์คืออะไร กำลังใช้งาน แต่รับประกันได้ถึง 9 หมายเลข)

ในลูปread lineAจะอ่านสตริงจากอินพุตมาตรฐานโดยค่าเริ่มต้นคือจากไฟล์file11(อินพุตมาตรฐานนั้นสืบทอดมาจากลูป) read lineA <&0นอกจากนี้ยังอาจได้รับการเขียน

ด้วยread lineB <&3การreadใช้คำสั่งอ่านจากไฟล์อธิบาย 3 คือจากfile22มากกว่าจากการป้อนข้อมูลมาตรฐาน (ไฟล์อธิบาย 3 สามารถใช้ได้ในวงเช่นเดียวกับการป้อนข้อมูลมาตรฐานคือ)

กล่าวโดยย่อจะใช้สตรีมอินพุตมาตรฐานและตัวอธิบายไฟล์ "พิเศษ" (หมายเลข 3) เพื่ออ่านจากสองไฟล์ "พร้อมกัน" (สตริงในแต่ละครั้งจากแต่ละไฟล์) โดยปกติจะมีเพียงหนึ่งในการเข้าถึงหนึ่งสตรีมใส่ แต่ทะลุข้อ จำกัด ที่ชัดเจนโดยการสร้างกระแสอินพุทที่สองและการเชื่อมต่อไปยังfile22ไฟล์

ที่เกี่ยวข้อง:


ฉันใช้คำว่า "string" ด้านบนมากกว่า "line" สิ่งที่อ่านจากไฟล์ทั้งสองจะมีช่องว่างขนาบข้างหลุดออกมาและลำดับการหลบหนีบางอย่างจะถูกตีความเป็นพิเศษ

หากต้องการอ่านบรรทัดโดยใช้readให้ใช้

IFS= read -r varname

ที่เกี่ยวข้อง:


คำตอบที่ดี! สิ่งที่ฉันไม่เข้าใจคือไฟล์ descriptor 3 สามารถใช้งานได้อย่างไร สิ่งนี้หมายความว่า3<file22เป็นเหมือนfopenที่ที่FIDไม่ถูกส่งคืน แต่ถูกระบุล่วงหน้าหรือไม่
A. Donda

2
@ A.Donda fdopen()คุณจะอธิบาย ใช่.
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.