在bash的无限循环期间禁用用户输入
我有这个bash脚本,它基本上启动了具有进度指示器的web和selenium服务器。由于硒服务器启动需要一些时间,我正在无限循环中检查状态。在bash的无限循环期间禁用用户输入
问题在于,在等待它启动时,我意外按下按键它将显示在屏幕上,如果循环结束(超时),它也会显示在命令提示符中。
我想禁用所有的用户输入(当然,除了控制键),而内循环:
start_selenium() {
echo -n "Starting selenium server"
java -jar ${selenium_jar} &> $selenium_log &
# wait for selenium server to spin up! (add -v for verbose output)
i=0
while ! nc -z localhost 4444; do
sleep 1
echo -n "."
((i++))
if [ $i -gt 20 ]; then
echo
echo -e $bg_red$bold"Selenium server connection timed out"$reset
exit 1
fi
done
}
使用stty
关闭键盘输入。
stty -echo
#### Ur Code here ####
stty echo
-echo
关闭键盘输入和stty echo
重新启用键盘输入。
的stty的调用是从http://www.unix.com/shell-programming-and-scripting/84624-nonblocking-i-o-bash-scripts.html
这仍然尊重按Ctrl-C,但不显示输入和消耗它,所以它不是留给外壳。
#!/bin/bash
hideinput()
{
if [ -t 0 ]; then
stty -echo -icanon time 0 min 0
fi
}
cleanup()
{
if [ -t 0 ]; then
stty sane
fi
}
trap cleanup EXIT
trap hideinput CONT
hideinput
n=0
while test $n -lt 10
do
read line
sleep 1
echo -n "."
n=$[n+1]
done
echo
因此,您在此处所做的是; 'stty time 0 min 0'设置读取超时和最小值。字符为0以避免'读''阻止IO并简单地读输入,它将无处可去。是对的吗?我不明白-icanon的使用,你不需要陷入SIGINT并在那里运行'stty sane'吗? – madpoet 2014-10-04 10:59:13
对,输入到一个名为“line”的变量,没有人使用。 – 2014-10-04 15:35:34
关闭icanon意味着输入将立即处理,无需等待换行符。尝试没有它的脚本,你会发现读取等待,不是因为读取超时,而是因为没有换行符。 – 2014-10-04 15:36:33
噢,我以为它会禁用所有的回声我应该先试着...谢谢... – madpoet 2014-10-01 08:56:30
这并不完全工作。它仅禁用回声。无论输入什么,仍然存在,只是看不见。 – 2014-10-01 08:58:42
是的。他想要禁止显示意外按键吗? – Fazlin 2014-10-01 09:01:31