วิธีจัดการ backspace ขณะอ่านหนังสือ


10

ฉันจะจัดการ backspaces ที่ป้อนมาได้อย่างไรมันจะแสดง^?ว่าพยายามแล้วและreadนับตัวอักขระอย่างไรเนื่องจาก12^?3ตัวอักษร 5 ตัวนั้นเสร็จสมบูรณ์แล้ว (แม้ว่าพวกเขาทั้งหมดจะไม่ใช่อินพุตจริง) แต่หลังจากที่12^?3^?มันกลับมาพร้อมท์แปลก ๆ กรุณาช่วย!

-bash-3.2$ read -n 5
12^?3^?-bash-3.2$

คำตอบ:


10

เมื่อคุณอ่านสายทั้งธรรมดาread(หรือread -rหรือตัวเลือกอื่น ๆ ที่ไม่ได้มีผลต่อพฤติกรรมนี้) บรรณาธิการสายเคอร์เนลที่ให้ตระหนักถึงความBackspaceสำคัญในการลบตัวละครตัวหนึ่งเช่นเดียวกับอื่น ๆ น้อยมากคำสั่ง (รวมทั้งReturnที่จะเสร็จสิ้นการป้อนข้อมูล บรรทัดและส่งมัน) สามารถกำหนดค่าปุ่มลัดด้วยsttyยูทิลิตี้ เทอร์มินัลบอกว่าอยู่ในโหมดสุกเมื่อตัวแก้ไขบรรทัดใช้งานอยู่ ในโหมด raw ตัวละครแต่ละตัวที่พิมพ์บนคีย์บอร์ดจะถูกส่งไปยังแอปพลิเคชันทันที ในโหมดที่ปรุงแล้วอักขระจะถูกเก็บไว้ในบัฟเฟอร์และจะมีการส่งเฉพาะบรรทัดที่สมบูรณ์ไปยังแอปพลิเคชัน

เพื่อหยุดการอ่านหลังจากมีจำนวนอักขระที่แน่นอนเพื่อนำไปใช้read -nbash ต้องเปลี่ยนไปใช้โหมด raw ในโหมด raw เทอร์มินัลจะไม่ทำการประมวลผลของBackspaceคีย์ใด ๆ(ตามเวลาที่คุณกดBackspaceอักขระก่อนหน้านี้ได้ถูกส่งไปยัง bash แล้ว) และ bash จะไม่ทำการประมวลผลใด ๆ เลย (น่าจะเป็นเพราะให้ความยืดหยุ่นมากกว่า การอนุญาตให้สคริปต์ทำการประมวลผลของตัวเอง)

คุณสามารถผ่านตัวเลือก-eเพื่อเปิดใช้งานการแก้ไขบรรทัดของ bash เอง (readline ซึ่งเป็นตัวแก้ไขบรรทัดที่เหมาะสม เนื่องจาก bash กำลังทำรุ่นโฆษณาบรรทัดมันสามารถหยุดอ่านเมื่อมีจำนวนอักขระที่ร้องขอ


9

ใช้read -e:

$ read -e -n 5
13acX

read -e หมายความว่า:

Readline (ดูการแก้ไขบรรทัดคำสั่ง ) ใช้เพื่อรับบรรทัด

เมื่อคุณทำเช่นนั้นคุณสามารถแก้ไขอินพุตในวิธีใด ๆ ที่คุณต้องการเมื่อเขียนที่ shell prompt ปกติรวมถึง backspace Homeและอื่น ๆ


1

readเป็นทุบตี builtin (ดูtype read) คุณสามารถค้นหาเอกสารด้วยman bash:

   read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
   [...]
          -e     If the standard input is coming from a terminal, readline (see READLINE above) is used to obtain the line.
                 Readline uses the current (or default, if line editing was not previously active) editing settings.

หรือคุณสามารถใช้help read:

read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
      -e                use Readline to obtain the line in an interactive shell

-eสวิตช์ช่วยให้การสนับสนุน ReadLine ซึ่งโดยทั่วไปจะช่วยให้ทุกคุณสมบัติที่มีอยู่ในเปลือกพร้อมรวมทั้งการจัดการ Backspace

ดังนั้นread -en 5ควรทำในสิ่งที่คุณต้องการ


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