在退格键上,“bash read -e”也会删除同一行 printf(预先存在的)文本

在退格键上,“bash read -e”也会删除同一行 printf(预先存在的)文本

我用printf "input: "; read -e。我输入一些内容然后按Backspace。当到达最后一个字符时,这会将该input:部分连同它一起删除。Backspace如果我之前没有输入任何内容或者使用简单read(没有 Readline),则不会出现行为不当。

答案1

readinbash是一个内置命令。通过库read -e使用bash全屏编辑readline(即它了解如何返回到上一行,在输入的文本中左右移动光标等)。它可以使用光标寻址代码来优化屏幕的输出。

但是,它期望光标在行开始时位于行的开头,有时删除输入时清除整行比删除单个字符更快。这就是搞乱你的提示符的原因,它将光标向右移动,而 bash 不知道这一点。

当在提示中使用终端转义符时(例如设置颜色或设置终端标题),也会发生同样的情况。为此,bash有特殊的转义符来指示哪些字节不移动光标。

你应该使用read -p 'input: ' -e-p提示选项是专门为此而设计的。

答案2

Aread -e调用 readline 库。它可以访问普通文本所read没有的几种编辑工具。然而,它假设有一个“空行”。

解决此问题的方法是提供一些内容(例如空格)以避免“空行”假设:

printf 'input:'; read -e -p ' '

但由于已经使用了该-p选项,因此编写可能更简单:

read -e -p 'input: '

相关内容