2014-10-01 41 views
5

我有这个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 
} 

回答

6

使用stty关闭键盘输入。

stty -echo 
#### Ur Code here #### 
stty echo 

-echo关闭键盘输入和stty echo重新启用键盘输入。

+0

噢,我以为它会禁用所有的回声我应该先试着...谢谢... – madpoet 2014-10-01 08:56:30

+0

这并不完全工作。它仅禁用回声。无论输入什么,仍然存在,只是看不见。 – 2014-10-01 08:58:42

+0

是的。他想要禁止显示意外按键吗? – Fazlin 2014-10-01 09:01:31

5

的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 
+0

因此,您在此处所做的是; 'stty time 0 min 0'设置读取超时和最小值。字符为0以避免'读''阻止IO并简单地读输入,它将无处可去。是对的吗?我不明白-icanon的使用,你不需要陷入SIGINT并在那里运行'stty sane'吗? – madpoet 2014-10-04 10:59:13

+0

对,输入到一个名为“line”的变量,没有人使用。 – 2014-10-04 15:35:34

+0

关闭icanon意味着输入将立即处理,无需等待换行符。尝试没有它的脚本,你会发现读取等待,不是因为读取超时,而是因为没有换行符。 – 2014-10-04 15:36:33