在使用读取(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循环中禁用用户输入的主要内容,如果未能解决你的问题,请参考以下文章