ทำไมคำสั่ง 'cat' สองคำนี้จึงแตกต่างกัน?


12

สมมติว่า infile มีข้อความเฉพาะและฉันต้องดำเนินการชุดคำสั่งต่อไปนี้:

exec 3<infile

แมว -n <&3

แมว -n <&3

อินสแตนซ์แรกของ cat จะแสดงเนื้อหาของไฟล์ แต่ครั้งที่สองดูเหมือนจะไม่ทำอะไรเลย ทำไมพวกเขาถึงแตกต่างกัน

คำตอบ:


29

พวกเขาดูเหมือนคำสั่งเดียวกัน แต่เหตุผลที่พวกเขาแตกต่างกันคือสถานะของระบบมีการเปลี่ยนแปลงเป็นผลมาจากคำสั่งแรก โดยเฉพาะไฟล์แรกที่catใช้ไฟล์ทั้งหมดดังนั้นไฟล์ที่สองcatไม่มีอะไรเหลือให้อ่านฮิต EOF (สิ้นสุดไฟล์) ทันทีและออก

เหตุผลที่อยู่เบื้องหลังนี้คือคุณกำลังใช้คำอธิบายไฟล์เดียวกันแน่นอน (หนึ่งที่คุณสร้างขึ้นด้วยexec < infileและมอบหมายให้อธิบายไฟล์3) catสำหรับทั้งสวดของ สิ่งหนึ่งที่เกี่ยวข้องกับคำอธิบายไฟล์แบบเปิดคือไฟล์ออฟเซ็ต ดังนั้นครั้งแรกที่catอ่านไฟล์ทั้งหมดออกจากออฟเซ็ทในตอนท้ายและไฟล์ที่สองพยายามที่จะรับจากจุดสิ้นสุดของไฟล์และพบว่าไม่มีอะไรให้อ่าน


12

เพียงเพิ่มคำตอบที่ดีของ @ 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)

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