Làm thế nào để xử lý backspace trong khi đọc?


10

Làm cách nào để tôi xử lý các không gian được nhập, nó hiển thị ^?nếu đã thử và cách readđếm các ký tự, vì 12^?3đã có 5 ký tự hoàn tất (mặc dù tất cả chúng không phải là đầu vào thực tế), nhưng sau khi 12^?3^?nó trả về dấu nhắc, thật kỳ lạ. Xin vui lòng giúp đỡ!

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

Câu trả lời:


10

Khi bạn đọc toàn bộ một dòng với các tùy chọn đơn giản read(hoặc read -rhoặc các tùy chọn khác không ảnh hưởng đến hành vi này), trình chỉnh sửa dòng được cung cấp kernel sẽ nhận ra Backspacekhóa để xóa một ký tự, cũng như một vài lệnh khác (bao gồm Returnđể hoàn thành đầu vào dòng và gửi nó). Các phím tắt có thể được cấu hình với sttytiện ích. Thiết bị đầu cuối được cho là ở chế độ nấu khi trình chỉnh sửa dòng đang hoạt động. Ở chế độ thô, mỗi ký tự được gõ trên bàn phím sẽ được truyền đến ứng dụng ngay lập tức. Trong chế độ nấu, các ký tự được lưu trữ trong bộ đệm và chỉ các dòng hoàn chỉnh được truyền đến ứng dụng.

Để dừng đọc sau một số ký tự cố định để thực hiện read -n, bash phải chuyển sang chế độ thô. Ở chế độ thô, thiết bị đầu cuối không thực hiện bất kỳ xử lý Backspacekhóa nào (tại thời điểm bạn nhấn Backspace, ký tự trước đã được gửi đến bash) và bash không thực hiện bất kỳ xử lý nào (có lẽ vì điều này mang lại tính linh hoạt cao hơn cho phép tập lệnh tự xử lý).

Bạn có thể vượt qua tùy chọn -eđể bật trình soạn thảo dòng riêng của bash (readline, đây là trình chỉnh sửa dòng thích hợp, không giống như trình soạn thảo cực kỳ thô sơ của kernel). Vì bash đang thực hiện phiên bản dòng, nó có thể ngừng đọc một khi nó có số lượng ký tự được yêu cầu.


9

Sử dụng read -e:

$ read -e -n 5
13acX

read -e có nghĩa là:

Readline (xem Chỉnh sửa dòng lệnh ) được sử dụng để có được dòng.

Khi bạn làm điều đó, bạn có thể chỉnh sửa đầu vào theo bất kỳ cách nào bạn sẽ làm khi viết tại dấu nhắc shell thông thường, bao gồm cả backspace, Homev.v.


1

readlà một bash dựng sẵn. (xem type read.) Bạn có thể tìm tài liệu với 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.

hoặc bạn có thể sử dụng 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

Công -etắc cho phép hỗ trợ readline về cơ bản cho phép tất cả các tính năng khả dụng tại dấu nhắc shell, bao gồm cả xử lý backspace.

Do đó read -en 5nên làm những gì bạn muốn.


-e giải quyết vấn đề nhưng cách readđọc 'số lượng ký tự được nhập' vẫn chưa được trả lời.
Keyshov Borate
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.