Backspace ไม่ทำงานในการรันสคริปต์ทุบตี


8

ฉันใช้งานสคริปต์ง่าย ๆ ที่อ่านทีละบรรทัดและพิมพ์บรรทัดที่ป้อนกลับไปที่เทอร์มินัล:

while read CMD; do
    echo $CMD
done

มันใช้งานได้ดี แต่เมื่อฉันพยายามแก้ไขบรรทัดด้วยbackspaceอักขระมันพิมพ์ออกมา^?แทนที่จะลบตัวอักษร และเมื่อผมกดCtrl+ ออกเป็นbackspace ^Hพฤติกรรมนี้สามารถแก้ไขได้อย่างไรเพื่อbackspaceลบอักขระแทนการเพิ่มอักขระเหล่านี้ ฉันพยายามstty erase '^?'สั่งการ แต่ไม่สำเร็จ


โปรดทราบ 16.10 ถึงสิ้นรอบการสนับสนุนเมื่อเดือนที่แล้ว คุณควรอัพเกรดเป็น 17.04 โดยเร็วที่สุด
ผู้บัญชาการไบต์

1
ฉันขอแนะนำให้เปลี่ยนจากread CMD read -e CMD
Cyrus

1
ลองแทนterminator gnome-terminalมันทำงานได้ตามที่คาดไว้
Severus Tux

1
@whtyger ใช้งานได้กับสคริปต์นี้ ในสถานการณ์จริงของฉันฉันมีอินพุตจากโปรแกรมซึ่งไม่ได้เรียกอ่าน ฉันไม่มีโอกาสเปลี่ยนสคริปต์โปรแกรมนี่เป็นเพียงตัวอย่างที่แสดงถึงปัญหาของฉัน มีการตั้งค่าระดับโลกที่ฉันสามารถกำหนดค่านี้ให้กับอินพุตทั้งหมดได้หรือไม่?
vrom911

1
@Cyrus My Backspace ใช้งานได้ตามที่ต้องการ - มันจะลบอักขระตัวสุดท้ายเสมอแม้สำหรับสคริปต์นี้จากคำถามที่ไม่มี-eตัวเลือก แต่บนเครื่องของ @ vrom911 นั้นไม่ได้เป็นเช่นนั้น ฉันสงสัยว่าเหตุใดจึงเกิดขึ้นและสามารถกำหนดค่านี้ได้ที่ไหน
Shersh

คำตอบ:


6

ปัญหาคือมีหลายวิธีในการแสดง backspace แต่readคำสั่งไม่เข้าใจทั้งหมด คุณควรกำหนดค่าสิ่งที่ถูกส่งเมื่อกดปุ่ม← Backspaceในการตั้งค่าเทอร์มินัลอีมูเลเตอร์ของคุณ

สมมติว่าคุณกำลังใช้gnome-terminalเป็นโปรแกรมจำลองเปิดแก้ไขมนูและคลิกที่การตั้งค่าโปรไฟล์ สลับไปที่แท็บความเข้ากันได้และคุณควรได้รับตัวเลือกเหล่านี้:

gnome-terminal การตั้งค่าโปรไฟล์→ความเข้ากันได้

ตอนนี้คุณสามารถเปลี่ยนคีย์ Backspace ที่สร้าง:การตั้งค่า คุณมีห้าตัวเลือกด้านล่างนี้ให้เลือก ฉันเพิ่มในเครื่องหมายวงเล็บว่าพวกเขาทำงานอย่างไรในระบบของฉัน:

  • อัตโนมัติ (ใช้งานได้)
  • Control-H (พิมพ์^Hแทน)
  • ASCII DEL (ค่าเริ่มต้นใช้งานได้)
  • ลำดับหนี (พิมพ์^[[3~แทน)
  • ลบ TTY (ทำงาน)

ปัจจุบันฉันมี ASCII DEL ฉันได้ลองทั้ง 5 ตัวเลือกแล้ว แต่ก็ไม่มีใครแก้ไขปัญหาได้
vrom911

นั่นเป็นเรื่องแปลก คุณสามารถบอกสิ่งที่ฉันtype readพูดและ$SHELL --versionรายงานเชลล์ / รุ่นอะไรได้บ้าง
ผู้บัญชาการ Byte

ฉันรู้ว่ามันแปลก ฉันพยายาม google ปัญหาของฉันมาก แต่ไม่พบวิธีแก้ปัญหาที่เหมาะกับฉัน กล่าวว่าtype read read is a shell builtinและ$SHELL --versionพูดว่าGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911

1

ฉันมีปัญหาเดียวกันโดยใช้ bash ใน Gnome-Terminal

โปรดทราบว่าในบรรทัดคำสั่ง backspace จะทำงานได้ตามที่คาดไว้ แต่เมื่อโปรแกรมของฉัน (ไคลเอ็นต์แชท TCP ซ็อกเก็ตที่ใช้งานง่าย) กำลังอ่านจาก stdin backspaceตัวอักษรจะพิมพ์ (สะท้อนกลับไปที่หน้าจอ) ^?แทนที่จะลบอักขระตัวสุดท้าย

ใช้# stty icanonเพื่ออนุญาตโหมด "canonical (สุก)" ดูคำอธิบายได้ที่นี่/unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

พื้นหลังเพิ่มเติมเกี่ยวกับปัญหา / วิธีแก้ไขของฉัน: ฉันมีปัญหาที่ฉันต้องวางอักขระมากกว่า 4k ตัว และในระหว่างการวิจัยนั้นฉันถูกพาไปที่ลิงก์ด้านบน ฉันเคย# stty -icanonปิดการใช้งานขีด จำกัด 4k แต่สูญเสียความสามารถในการใช้ backspace (ลบ)

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