สมมติว่า infile มีข้อความเฉพาะและฉันต้องดำเนินการชุดคำสั่งต่อไปนี้:
exec
3<infile
แมว -n
<&3
แมว -n
<&3
อินสแตนซ์แรกของ cat จะแสดงเนื้อหาของไฟล์ แต่ครั้งที่สองดูเหมือนจะไม่ทำอะไรเลย ทำไมพวกเขาถึงแตกต่างกัน
สมมติว่า infile มีข้อความเฉพาะและฉันต้องดำเนินการชุดคำสั่งต่อไปนี้:
exec
3<infile
แมว -n
<&3
แมว -n
<&3
อินสแตนซ์แรกของ cat จะแสดงเนื้อหาของไฟล์ แต่ครั้งที่สองดูเหมือนจะไม่ทำอะไรเลย ทำไมพวกเขาถึงแตกต่างกัน
คำตอบ:
พวกเขาดูเหมือนคำสั่งเดียวกัน แต่เหตุผลที่พวกเขาแตกต่างกันคือสถานะของระบบมีการเปลี่ยนแปลงเป็นผลมาจากคำสั่งแรก โดยเฉพาะไฟล์แรกที่cat
ใช้ไฟล์ทั้งหมดดังนั้นไฟล์ที่สองcat
ไม่มีอะไรเหลือให้อ่านฮิต EOF (สิ้นสุดไฟล์) ทันทีและออก
เหตุผลที่อยู่เบื้องหลังนี้คือคุณกำลังใช้คำอธิบายไฟล์เดียวกันแน่นอน (หนึ่งที่คุณสร้างขึ้นด้วยexec < infile
และมอบหมายให้อธิบายไฟล์3
) cat
สำหรับทั้งสวดของ สิ่งหนึ่งที่เกี่ยวข้องกับคำอธิบายไฟล์แบบเปิดคือไฟล์ออฟเซ็ต ดังนั้นครั้งแรกที่cat
อ่านไฟล์ทั้งหมดออกจากออฟเซ็ทในตอนท้ายและไฟล์ที่สองพยายามที่จะรับจากจุดสิ้นสุดของไฟล์และพบว่าไม่มีอะไรให้อ่าน
เพียงเพิ่มคำตอบที่ดีของ @ jw013 มันอาจช่วยให้ตระหนักว่ามันเป็นเช่นเดียวกับ
{
cat -n
cat -n
} < infile
< file
ย่อมาจาก0< file
นั่นคือใช้ file descriptor 0 แทน 3
และเพื่อสร้างความสับสนให้กับเรื่องเล็กน้อยรุ่นนี้:
exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3
ทำงานแตกต่างกันไปขึ้นอยู่กับระบบปฏิบัติการที่คุณใช้งานและประเภทของinfile
(ไฟล์ปกติเทียบกับท่อกับอุปกรณ์ ... )
บน Solaris และ Unices เชิงพาณิชย์ส่วนใหญ่open("/dev/fd/3")
จะมีค่าเท่ากับหรือน้อยกว่าdup(3)
(เช่น< /dev/fd/3
เดียวกับ<&3
) ในขณะที่บน Linux สำหรับไฟล์ปกติ/dev/fd/3
จะถูกนำมาใช้เป็น symlink ไปยังไฟล์ต้นฉบับดังนั้นจึงopen("/dev/fd/3")
เปิดใหม่ตั้งแต่เริ่มต้น ( และอาจมีธงแตกต่างจาก fd 3)