ใน
./binary < file
binary
's stdin คือไฟล์ที่เปิดในโหมดอ่านอย่างเดียว โปรดทราบว่าbash
ไม่อ่านไฟล์ทั้งหมดก็เพียงแค่เปิดมันสำหรับการอ่านบนอธิบายไฟล์ 0 (stdin) ของกระบวนการที่จะรันbinary
ใน
ใน:
./binary << EOF
test
EOF
ขึ้นอยู่กับเชลล์binary
stdin ของจะเป็นไฟล์ชั่วคราวที่ถูกลบ (AT&T ksh, zsh, bash ... ) ที่บรรจุtest\n
ไว้โดยเชลล์หรือที่ปลายอ่านของไพพ์ ( dash
, yash
และเชลล์เขียนtest\n
แบบขนาน) ที่ปลายอีกด้านของท่อ) ในกรณีของคุณถ้าคุณใช้bash
มันจะเป็นไฟล์ชั่วคราว
ใน:
cat file | ./binary
ขึ้นอยู่กับเชลล์binary
stdin ของจะเป็นปลายอ่านของท่อหรือปลายด้านหนึ่งของซ็อกเก็ตคู่ที่ทิศทางการเขียนถูกปิด (ksh93) และcat
กำลังเขียนเนื้อหาของfile
ที่ปลายอีกด้านหนึ่ง
เมื่อ stdin เป็นไฟล์ปกติ (ชั่วคราวหรือไม่) ก็จะหาได้ binary
อาจไปที่จุดเริ่มต้นหรือจุดสิ้นสุดย้อนกลับ ฯลฯ นอกจากนี้ยังสามารถ mmap ทำบางอย่างioctl()s
เช่น FIEMAP / FIBMAP (หากใช้<>
แทน<
มันสามารถตัด / เจาะรูใน ฯลฯ )
ท่อและซ็อกเก็ตคู่ในอีกทางหนึ่งคือการสื่อสารระหว่างกระบวนการหมายความว่าไม่มีอะไรที่binary
สามารถทำได้นอกเหนือread
จากข้อมูล (แม้ว่าจะมีการดำเนินการบางอย่างเช่นท่อเฉพาะบางอย่างioctl()
ที่สามารถทำได้กับพวกเขาและไม่ใช่ไฟล์ปกติ) .
มากที่สุดเท่าที่มันเป็นความสามารถไปseek
ที่ทำให้เกิดการใช้งานที่จะล้มเหลว / บ่นเมื่อทำงานร่วมกับท่อ แต่มันอาจจะเป็นที่ใด ๆ ของสายระบบอื่น ๆ ที่ถูกต้องเกี่ยวกับไฟล์ปกติ แต่ไม่เกี่ยวกับชนิดของไฟล์ (เช่นmmap()
, ftruncate()
, fallocate()
) . บน Linux ยังมีพฤติกรรมที่แตกต่างกันมากเมื่อคุณเปิด/dev/stdin
ในขณะที่ fd 0 อยู่ในไพพ์หรือไฟล์ปกติ
มีคำสั่งจำนวนมากออกมีที่สามารถจัดการกับseekableไฟล์ แต่เมื่อเป็นกรณีที่ว่าโดยทั่วไปไม่ได้สำหรับไฟล์ที่เปิด stdin ของพวกเขา
$ unzip -l file.zip
Archive: file.zip
Length Date Time Name
--------- ---------- ----- ----
11 2016-12-21 14:43 file
--------- -------
11 1 file
$ unzip -l <(cat file.zip)
# more or less the same as cat file.zip | unzip -l /dev/stdin
Archive: /proc/self/fd/11
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of /proc/self/fd/11 or
/proc/self/fd/11.zip, and cannot find /proc/self/fd/11.ZIP, period.
unzip
จำเป็นต้องอ่านดัชนีที่เก็บไว้ที่ท้ายไฟล์แล้วค้นหาภายในไฟล์เพื่ออ่านสมาชิกไฟล์เก็บถาวร แต่ที่นี่ไฟล์ (ปกติในกรณีแรกไพพ์ในวินาที) ถูกกำหนดเป็นอาร์กิวเมนต์พา ธunzip
และunzip
เปิดไฟล์เอง (โดยทั่วไปคือ fd นอกเหนือจาก 0) แทนที่จะเป็นสืบทอด fd ที่เปิดโดยผู้ปกครอง ไม่อ่านไฟล์ zip จาก stdin stdin ส่วนใหญ่จะใช้สำหรับการโต้ตอบกับผู้ใช้
หากคุณเรียกใช้งานbinary
ของคุณโดยไม่มีการเปลี่ยนเส้นทางที่พร้อมต์ของเชลล์แบบโต้ตอบที่ทำงานในเทอร์มินัลอีมูเลเตอร์binary
stdin ของจะถูกสืบทอดมาจากพาเรนต์ของเชลล์ซึ่งตัวมันเองจะได้รับสืบทอดจากพาเรนต์เทอร์มินัล อุปกรณ์ pty เปิดในโหมดอ่าน + เขียน (คล้าย/dev/pts/n
)
อุปกรณ์เหล่านั้นหาไม่ได้เช่นกัน ดังนั้นหากใช้binary
งานได้ดีเมื่อรับข้อมูลจากเทอร์มินัลปัญหาอาจไม่เกี่ยวกับการค้นหา
หาก 14 นั้นหมายถึงว่าเป็น errno (รหัสข้อผิดพลาดที่ตั้งค่าโดยการเรียกระบบล้มเหลว) แสดงว่าในระบบส่วนใหญ่นั้นจะเป็นEFAULT
( ที่อยู่ไม่ถูกต้อง) การread()
เรียกของระบบอาจล้มเหลวพร้อมกับข้อผิดพลาดนั้นหากถูกขอให้อ่านที่อยู่หน่วยความจำที่ไม่สามารถเขียนได้ ที่จะเป็นอิสระจากว่า FD ในการอ่านข้อมูลจากจุดไปยังท่อหรือแฟ้มปกติและโดยทั่วไปจะระบุข้อผิดพลาด1
binary
อาจกำหนดประเภทของไฟล์ที่เปิดอยู่บน stdin (พร้อมfstat()
) และพบข้อผิดพลาดเมื่อไม่ใช่ไฟล์ปกติหรืออุปกรณ์ tty
ยากที่จะบอกโดยไม่ทราบเพิ่มเติมเกี่ยวกับแอปพลิเคชัน การเรียกใช้ภายใต้strace
(หรือtruss
/ tusc
เทียบเท่าในระบบของคุณ) สามารถช่วยให้เราเห็นว่าการเรียกของระบบคืออะไรหากมีสิ่งใดที่ล้มเหลวที่นี่
1สถานการณ์สมมติโดยMatthew Ifeแสดงความคิดเห็นต่อคำถามของคุณฟังดูมีเหตุผลมากที่นี่ อ้างถึงเขา:
ฉันสงสัยว่ามันกำลังมองหาจุดสิ้นสุดของไฟล์เพื่อรับขนาดบัฟเฟอร์สำหรับการอ่านข้อมูลการจัดการกับความจริงที่ว่าการค้นหาไม่ได้ผลและพยายามจัดสรรขนาดลบ (ไม่จัดการ malloc ที่ไม่ดี) การส่งผ่านบัฟเฟอร์เพื่ออ่านว่าข้อบกพร่องใดที่กำหนดให้บัฟเฟอร์นั้นไม่ถูกต้อง