阅读时如何处理退格键?


10

我如何处理输入的退格键,它显示^?是否尝试过以及如何read计算字符,因为12^?3已经有5个字符完成了(尽管它们都不是实际的输入),但是在12^?3^?返回提示后,很奇怪。请帮忙!

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

Answers:


10

当您用纯文本read(或read -r其他不影响此行为的选项)读取整行时,内核提供的行编辑器会识别Backspace用于擦除一个字符的键以及很少的其他命令(包括Return完成输入)行并发送)。可以使用实用程序配置快捷键stty。当终端的行编辑器处于活动状态时,该终端被称为处于熟模式。在原始模式下,键盘上键入的每个字符都会立即传输到应用程序。在熟模式下,字符存储在缓冲区中,只有完整的行才传输到应用程序。

为了在固定数量的字符后停止读取以便执行read -n,bash必须切换到原始模式。在原始模式下,终端不对Backspace键进行任何处理(在您按时Backspace,前一个字符已发送到bash),bash也未进行任何处理(大概是因为这样做具有更大的灵活性)允许脚本自行处理)。

您可以传递该选项-e以启用bash自己的行编辑器(readline,这是一种合适的行编辑器,不像内核的极其原始的行编辑器)。由于bash正在进行线路编辑,因此一旦具有要求的字符数,它就可以停止读取。


9

用途read -e

$ read -e -n 5
13acX

read -e 意思是:

Readline(请参阅命令行编辑)用于获取该行。

完成此操作后,您可以使用在常规shell提示符下编写时所用的任何方式来编辑输入,包括退格键,Home等等。


1

read是内置的bash。(请参阅参考资料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支持,该支持基本上允许在shell提示符下使用所有功能,包括退格键处理。

因此read -en 5应该做你想做的。


-e解决了该问题,但是如何read读取“输入的字符数”仍然没有答案。
Keyshov Borate
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.