ตามที่คุณส่วนใหญ่ทำมาแล้วหลายครั้งการดูตัวอักษรแบบยาวทำได้โดยสะดวกless
:
some_command | less
ตอนนี้ stdin เชื่อมต่อกับไพพ์ (FIFO) แล้ว มันยังสามารถอ่านคำสั่งเช่นขึ้น / ลง / ออกได้อย่างไร?
less
อ่านข้อมูลจาก stdin และคำสั่งจาก tty
ตามที่คุณส่วนใหญ่ทำมาแล้วหลายครั้งการดูตัวอักษรแบบยาวทำได้โดยสะดวกless
:
some_command | less
ตอนนี้ stdin เชื่อมต่อกับไพพ์ (FIFO) แล้ว มันยังสามารถอ่านคำสั่งเช่นขึ้น / ลง / ออกได้อย่างไร?
less
อ่านข้อมูลจาก stdin และคำสั่งจาก tty
คำตอบ:
ดังกล่าวโดยวิลเลียม Pursell , less
อ่านการกดแป้นพิมพ์ของผู้ใช้จากขั้ว มันเปิดขึ้นอย่างชัดเจน/dev/tty
สถานีควบคุม; ที่ให้คำอธิบายไฟล์แยกจากอินพุตมาตรฐานซึ่งสามารถอ่านอินพุตแบบโต้ตอบของผู้ใช้ได้ สามารถอ่านข้อมูลที่จะแสดงจากอินพุตมาตรฐานในเวลาเดียวกันหากจำเป็น (สามารถเขียนโดยตรงไปยังเทอร์มินัลหากจำเป็น)
คุณสามารถเห็นสิ่งนี้เกิดขึ้นได้จากการวิ่ง
some_command | strace -o less.trace -e open,read,write less
ย้ายไปรอบ ๆ อินพุตออกless
และดูเนื้อหาของless.trace
: คุณจะเห็นมันเปิดอยู่/dev/tty
และอ่านจากทั้งตัวอธิบายไฟล์ 0 และสิ่งใดที่ถูกส่งคืนเมื่อมันเปิด/dev/tty
(น่าจะเป็น 3)
นี่เป็นวิธีปฏิบัติทั่วไปสำหรับโปรแกรมที่ต้องการให้แน่ใจว่าพวกเขากำลังอ่านและเขียนไปยังเทอร์มินัล ตัวอย่างหนึ่งคือ SSH เช่นเมื่อขอรหัสผ่านหรือวลีรหัสผ่าน
ตามที่อธิบายโดยschilyหาก/dev/tty
ไม่สามารถเปิดได้less
จะอ่านจากข้อผิดพลาดมาตรฐาน (ตัวอธิบายไฟล์ 2) less
มีการ/dev/tty
แนะนำการใช้งานในรุ่น 177 วางจำหน่ายเมื่อวันที่ 2 เมษายน 1991
ถ้าคุณพยายามที่ทำงานcat /dev/tty | less
เป็นปัญหาโดยHagen ฟอน Eitzen , less
จะประสบความสำเร็จในการเปิด/dev/tty
แต่จะไม่ได้รับข้อมูลใด ๆ จากมันจนกว่าcat
จะปิดมัน ดังนั้นคุณจะเห็นหน้าจอว่างเปล่าและไม่มีอะไรอื่นจนกว่าคุณCtrlCจะกดเพื่อฆ่าcat
(หรือฆ่าด้วยวิธีอื่น); จากนั้นless
จะแสดงสิ่งที่คุณพิมพ์ในขณะที่cat
ทำงานและอนุญาตให้คุณควบคุม
cat blah |
สามารถถูกแทนที่ด้วย< blah
และถึงแม้ว่ามันจะไม่จำเป็นในกรณีนี้เพราะมันใช้less blah
งานได้ (เช่นกันless -f /dev/tty
) แต่อ่านจาก/dev/tty
เป็นบิตของการเป็นกรณีพิเศษและทั้งสามสายพันธุ์ ( cat /dev/tty | less
, less < /dev/tty
และless -f /dev/tty
) ผลลัพธ์ที่แตกต่าง
UNIX มีสองวิธีในการอ่านอินพุตของผู้ใช้ในขณะที่ stdin ถูกเปลี่ยนเส้นทาง:
วิธีการเดิมคือการอ่านจากstderr Stderr เปิดให้บริการสำหรับการเขียนและการอ่านและยังคงกล่าวถึงใน POSIX
รุ่น UNIX ในภายหลังได้ (ประมาณปี 1979) เพิ่ม/dev/tty
อินเตอร์เฟสไดรเวอร์ที่อนุญาตให้เปิดการควบคุม tty ของกระบวนการ เนื่องจากมีกระบวนการที่ไม่มี tty ควบคุมจึงเป็นไปได้ที่ความพยายามในการเปิด/dev/tty
ล้มเหลว ซอฟต์แวร์ที่เขียนเป็นมิตรจึงมีทางเลือกกลับไปที่วิธีดั้งเดิมแล้วพยายามอ่านจาก stderr
dup()
ลิขสิทธิ์ของคำอธิบายไฟล์เดียวกันแม้ว่าทั้งหมดจะเปิดบน tty (เห็นได้ชัด POSIX ยังคงต้องหรือแนะนำ (คำตอบนี้ไม่ได้พูด) ที่ stderr เป็นอ่าน / เขียน FD ไม่เปิดกับสิ่งที่ต้องการopen("/dev/ttyS0", O_WRONLY)
อ่าน stderr จะล้มเหลวในกรณีที่..)
less
อ่านข้อมูลที่จะแสดงจาก stdin และอ่านคำสั่งจาก tty พวกมันต่างกัน