Backspace không hoạt động bên trong chạy tập lệnh bash


8

Tôi đang chạy tập lệnh rất đơn giản, đọc từng dòng và in dòng đã nhập trở lại thiết bị đầu cuối:

while read CMD; do
    echo $CMD
done

Nó hoạt động tốt, nhưng khi tôi cố gắng chỉnh sửa dòng với backspaceký tự, nó sẽ in ^?thay vì xóa ký tự. Và khi tôi nhấn Ctrl+ backspaceđầu ra là ^H. Làm thế nào hành vi này có thể được sửa chữa để backspaceloại bỏ ký tự thay vì thêm các ký tự này? Tôi đã thử stty erase '^?'lệnh nhưng không thành công.


Xin lưu ý 16.10 đã kết thúc chu kỳ hỗ trợ vào tháng trước. Bạn nên nâng cấp lên 17.04 càng sớm càng tốt.
Chỉ huy Byte

1
Tôi đề nghị thay thế read CMDbằng read -e CMD.
Cyrus

1
thử terminatorthay vì gnome-terminal. Nó hoạt động như mong đợi
Severus Tux

1
@whtyger điều này làm việc cho kịch bản này. Trong tình huống thực tế của tôi, tôi có đầu vào từ chương trình, mà không gọi là đọc. Tôi không có cơ hội để thay đổi kịch bản chương trình, đây chỉ là một ví dụ đại diện cho vấn đề của tôi. Có bất kỳ cài đặt toàn cầu nào mà tôi có thể thực hiện cấu hình này cho tất cả đầu vào không?
vrom911

1
@Cyrus Backspace của tôi hoạt động như tôi muốn - nó luôn xóa ký tự cuối cùng, ngay cả đối với tập lệnh này khỏi câu hỏi mà không có -etùy chọn. Nhưng trên máy của @ vrom911 thì không phải vậy. Tôi tự hỏi tại sao nó xảy ra và nơi này có thể được cấu hình.
Shersh

Câu trả lời:


6

Vấn đề là có nhiều cách để thể hiện một khoảng lùi, nhưng readlệnh không hiểu tất cả chúng. Bạn sẽ có thể định cấu hình chính xác những gì được gửi khi nhấn ← Backspacephím trong cài đặt trình giả lập thiết bị đầu cuối của bạn.

Giả sử bạn đang sử dụng gnome-terminallàm trình giả lập, hãy mở manu Chỉnh sửa và nhấp vào Tùy chọn hồ sơ . Chuyển sang tab Tương thích và bạn sẽ nhận được các tùy chọn sau:

gnome-terminal → tùy chọn hồ sơ → khả năng tương thích

Bây giờ bạn có thể thay đổi phím Backspace tạo: cài đặt. Bạn có năm tùy chọn dưới đây có sẵn để lựa chọn. Tôi đã thêm vào trong niềng răng cách họ cư xử trên hệ thống của tôi:

  • Tự động (hoạt động)
  • Control-H (in ^Hthay thế)
  • ASCII DEL (mặc định, hoạt động)
  • Trình tự thoát (in ^[[3~thay thế)
  • Xóa TTY (hoạt động)

Hiện tại tôi có ASCII DEL. Tôi đã thử tất cả 5 tùy chọn nhưng không có lựa chọn nào trong số đó khắc phục được sự cố.
vrom911

Điều đó lạ thật. Bạn có thể cho tôi biết những gì type readnói và những gì $SHELL --versionbáo cáo shell / phiên bản ?
Chỉ huy Byte

Tôi biết nó là lạ. Tôi đã cố gắng google vấn đề của mình rất nhiều nhưng không tìm được giải pháp phù hợp với mình. type readnói read is a shell builtin. và $SHELL --versionnóiGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911

1

Tôi gặp vấn đề tương tự, sử dụng bash trong Gnome-Terminal.

Lưu ý rằng trên dòng lệnh, backspace hoạt động như mong đợi, nhưng khi chương trình của tôi (một ứng dụng trò chuyện dựa trên ổ cắm TCP đơn giản) đang đọc từ stdin, backspaceký tự sẽ in (lặp lại màn hình) ^?thay vì xóa ký tự cuối cùng.

Sử dụng # stty icanonđể cho phép "chế độ chính tắc (nấu chín)". Xem một số giải thích tại đây /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

Một số thông tin cơ bản khác cho vấn đề / giải pháp của tôi: Tôi gặp vấn đề khi cần dán hơn 4k ký tự. Và trong quá trình nghiên cứu đó, tôi đã được dẫn đến liên kết trên. Tôi đã sử dụng # stty -icanonđể vô hiệu hóa giới hạn 4k, nhưng mất khả năng sử dụng backspace (xóa).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.