阅读时如何处理退格?

阅读时如何处理退格?

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

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

答案1

read当您使用普通(或read -r或其他不影响此行为的选项)读取整行时,内核提供的行编辑器会识别Backspace擦除一个字符以及极少数其他字符的键命令(包括Return完成输入行并发送)。快捷键可以是配置好的stty公用事业。当行编辑器处于活动状态时,终端据说处于烘焙模式。在原始模式下,在键盘上键入的每个字符都会立即传输到应用程序。在烘焙模式下,字符存储在缓冲区中,并且仅将完整的行传输到应用程序。

为了在固定数量的字符后停止读取以实现read -n,bash必须切换到原始模式。在原始模式下,终端不会对按键进行任何处理Backspace(当您按下 时Backspace,前面的字符已经发送到 bash),并且 bash 也不进行任何处理(大概是因为这提供了更大的灵活性)允许脚本进行自己的处理)。

您可以传递选项-e来启用 bash 自己的行编辑器(readline,这是一种合适的行编辑器,而不是像内核极其粗糙的编辑器)。由于 bash 正在进行行编辑,因此一旦达到请求的字符数,它就会停止读取。

答案2

使用read -e:

$ read -e -n 5
13acX

read -e意思是:

阅读线(参见命令行编辑) 用于获取直线。

当您执行此操作时,您可以按照在常规 shell 提示符下编写时的任何方式编辑输入,包括退格键、Home等等。

答案3

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应该做你想做的事。

相关内容