2014-10-01 40 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