我如何处理输入的退格键,它显示^?
是否尝试过以及如何read
计算字符,因为12^?3
已经有5个字符完成了(尽管它们都不是实际的输入),但是在12^?3^?
返回提示后,很奇怪。请帮忙!
-bash-3.2$ read -n 5
12^?3^?-bash-3.2$
我如何处理输入的退格键,它显示^?
是否尝试过以及如何read
计算字符,因为12^?3
已经有5个字符完成了(尽管它们都不是实际的输入),但是在12^?3^?
返回提示后,很奇怪。请帮忙!
-bash-3.2$ read -n 5
12^?3^?-bash-3.2$
Answers:
当您用纯文本read
(或read -r
其他不影响此行为的选项)读取整行时,内核提供的行编辑器会识别Backspace用于擦除一个字符的键以及很少的其他命令(包括Return完成输入)行并发送)。可以使用实用程序配置快捷键stty
。当终端的行编辑器处于活动状态时,该终端被称为处于熟模式。在原始模式下,键盘上键入的每个字符都会立即传输到应用程序。在熟模式下,字符存储在缓冲区中,只有完整的行才传输到应用程序。
为了在固定数量的字符后停止读取以便执行read -n
,bash必须切换到原始模式。在原始模式下,终端不对Backspace键进行任何处理(在您按时Backspace,前一个字符已发送到bash),bash也未进行任何处理(大概是因为这样做具有更大的灵活性)允许脚本自行处理)。
您可以传递该选项-e
以启用bash自己的行编辑器(readline,这是一种合适的行编辑器,不像内核的极其原始的行编辑器)。由于bash正在进行线路编辑,因此一旦具有要求的字符数,它就可以停止读取。
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
应该做你想做的。
read
读取“输入的字符数”仍然没有答案。