สมมติว่า 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)