我用printf "input: "; read -e
。我输入一些内容然后按Backspace
。当到达最后一个字符时,这会将该input:
部分连同它一起删除。Backspace
如果我之前没有输入任何内容或者使用简单read
(没有 Readline),则不会出现行为不当。
答案1
read
inbash
是一个内置命令。通过库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: '