在使用读取(bash)的while循环中禁用用户输入

Posted

技术标签:

【中文标题】在使用读取(bash)的while循环中禁用用户输入【英文标题】:Disable user input during sleep in while loop with read (bash) 【发布时间】:2021-06-17 09:33:03 【问题描述】:

我有一个带有 while 循环的小 bash 脚本,它等待用户输入,做某事然后休眠一段时间:

while true; do
  read input
  echo $input
  sleep 5
done

我不希望它在睡眠期间接受任何用户输入。问题是当脚本继续时,在睡眠期间输入到 shell 中的任何输入都会被处理。是否可以在睡眠期间完全禁用用户输入?

我见过这个:Disabling user input during an infinite loop in bash,但这对我没有帮助,不是吗?

希望有人可以帮助我。

【问题讨论】:

“接受”用户输入是什么意思?通常,在 unix 中,您在输入未被接受时输入的任何内容都会立即回显,并存储在缓冲区中,因此如果稍后读取输入的内容,它将接收输入的内容。这通常称为“typeahead”。您的脚本是否在执行与此不同的操作,或者您是否希望它执行与此不同的操作? 感谢您的澄清。我不知道。是的,我希望它做一些不同的事情,即忽略睡眠时收到的任何输入,只在醒来后接收新的输入。 【参考方案1】:

这是需要的:

#!/usr/bin/env bash
  
hideinput()
  [ -t 0 ] && stty -echo -icanon time 0 min 0

cleanup() 
  [ -t 0 ] && stty sane

trap cleanup EXIT
trap hideinput CONT

while true; do
  while read -t 0.001 -n 10000 discard; do :; done # Discard anything already inputted.
  cleanup
  read -p "Input something   :  " input
  hideinput
  echo "What you inputted : " $input
  sleep 5
done

【讨论】:

像魅力一样工作,非常感谢!不过,对我来说似乎更像是一种解决方法。是我想要实现如此不寻常的事情还是为什么没有更直接的解决方案? (不要误会我的意思。我对你的解决方案很满意,我只是好奇)。 完全同意。这似乎有点矫枉过正,但这是我能得到的最简单的方法。

以上是关于在使用读取(bash)的while循环中禁用用户输入的主要内容,如果未能解决你的问题,请参考以下文章

While循环重置Bash脚本中的数字变量[重复]

C#while循环不起作用[关闭]

在无限while循环中从管道输入中读取行

如果函数内部的条件失败,则跳过 bash while 循环

Linux的shell脚本实战之while循环

while循环合理运用-判断成绩脚本