在 bash 中读取 1 行或多行 - 使其在粘贴时起作用(除了手动输入之外)

在 bash 中读取 1 行或多行 - 使其在粘贴时起作用(除了手动输入之外)

我阅读了多个具有不同复杂程度的答案。当手动输入时,大多数都运行良好。

例如:https://stackoverflow.com/a/20913871/1841533

这是我的示例代码,与该答案中的代码非常接近:

_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do 
  theanswer="${theanswer}${more}"
done

当我手动输入答案时,这也很有效,即:逐个字符......

但是如果我粘贴一行(或多行):它在读取每个字符后回显“剩余缓冲区”...使显示变得混乱。

我还没有找到一种方法来隐藏它,同时保持屏幕上的正常回声。 (即,如果输入或粘贴,我仍然想查看输入/粘贴的内容)

简短的示例:这是我逐字符手动输入“abcd”时的(良好)提示:

answer: abcd

但是,如果我通过用鼠标在一个瞬间粘贴“abcd”来提供它,它会在读取每个字符后重复读取剩余的整个缓冲区,从而扰乱回显:

answer: abcdbcdcdd

tl/dr:该片段在逐个字符输入时效果很好,但在读取粘贴条目的每个字符后会回显剩余的读取缓冲区。

答案1

我可能找到了解决方法......但我也希望有人给出更好的东西。

更正的代码:我隐藏了正常的回显,并且在每次读取后我自己回显:

stty_orig=`stty -g`  ### added this
stty -echo           ### added this
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
printf "$theanswer" >&2 ;  ### added this
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
  printf "$more" >&2 ;  ### added this
  theanswer="${theanswer}${more}"
done

stty $stty_orig  ### added this

到目前为止,似乎已经完成了我需要的一切...但我不喜欢以这种方式打印到 stderr...(也许最好改为 printf 到 /dev/tty ?)

编辑: A大的缺点是:很难处理“退格”或删除:如果输入 1 行或多行文本的人想要更改某些内容,则解释更正键非常困难......拥有允许 1 行或多行输入的 readline 会成为这里最好的...(也许 Perl 有一个?)

相关内容