阅读时如何处理退格?

Key*_*ate 11 shell bash line-editor read

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

-bash-3.2$ read -n 5
12^?3^?-bash-3.2$
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 10

使用read -e

$ read -e -n 5
13acX
Run Code Online (Sandbox Code Playgroud)

read -e 意思是:

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

当您这样做时,您可以按照在常规 shell 提示符下书写时使用的任何方式来编辑输入,包括退格、Home等。


Gil*_*il' 10

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

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

您可以传递选项-e以启用 bash 自己的行编辑器(readline,它是一个适当的行编辑器,而不是内核极其粗糙的编辑器)。由于 bash 正在执行行编辑,因此一旦获得请求的字符数,它就可以停止读取。