我如何处理输入的退格键,它显示^?
是否尝试过以及如何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
答案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
应该做你想做的事。