【问题标题】:Disable user input during sleep in while loop with read (bash)在使用读取(bash)的while循环中禁用用户输入
【发布时间】: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”。您的脚本是否在执行与此不同的操作,或者您是否希望它执行与此不同的操作?
  • 感谢您的澄清。我不知道。是的,我希望它做一些不同的事情,即忽略睡眠时收到的任何输入,只在醒来后接收新的输入。

标签: bash while-loop user-input sleep


【解决方案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

【讨论】:

  • 像魅力一样工作,非常感谢!不过,对我来说似乎更像是一种解决方法。是我想要实现如此不寻常的事情还是为什么没有更直接的解决方案? (不要误会我的意思。我对你的解决方案很满意,我只是好奇)。
  • 完全同意。这似乎有点矫枉过正,但这是我能得到的最简单的方法。
猜你喜欢
  • 2016-05-20
  • 2019-12-05
  • 2013-11-16
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多