2014-10-01 10 views
5

Ich habe dieses Bash-Skript, das im Grunde startet das Web und Selenserver mit Fortschrittsanzeige. Da es etwas Zeit braucht, bis Selen Server startet, überprüfe ich den Status in einer Endlosschleife.Deaktivieren der Benutzereingabe während einer Endlosschleife in bash

Das Problem ist, während ich darauf warte, dass ich die Tasten versehentlich drücke, wird es auf dem Bildschirm angezeigt und wenn die Schleife endet (Zeitüberschreitung), wird es auch in der Eingabeaufforderung angezeigt.

Ich möchte alle Benutzereingaben deaktivieren (mit Ausnahme der Steuertasten natürlich), während in der Schleife:

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 
} 

Antwort

6

Verwenden stty auf Tastatureingaben auszuschalten.

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

-echo schaltet sich die Tastatureingabe und stty echo reaktiviert die Tastatureingabe.

+0

Oh, ich dachte, es wird alle Echos deaktivieren Ich hätte es zuerst versucht ... Danke ... – madpoet

+0

Dies funktioniert nicht genau. Es deaktiviert nur das Echo. Was immer getippt wird, ist immer noch da, nur unsichtbar. –

+0

Ja. Er wollte die Anzeige von versehentlichen Tasten drücken, richtig? – Fazlin

5

Die stty Anrufungen sind von http://www.unix.com/shell-programming-and-scripting/84624-nonblocking-i-o-bash-scripts.html

Dies respektiert noch Strg-C, aber Eingabe nicht angezeigt, und es verbraucht so ist es nicht für die Shell verlassen.

#!/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

Was Sie hier getan haben, ist also ; Mit 'stty time 0 min 0' setzen Sie den Lese-Timeout und min. chars to 0, um zu vermeiden, dass "read" das IO blockiert und einfach die Eingabe liest und es ins Nirgendwo geht. Ist das richtig? Ich verstehe die Verwendung von -icanon nicht und musst du SIGINT nicht fangen und die "stty sane" dort laufen lassen? – madpoet

+0

Richtig, die Eingabe geht an eine Variable namens "line", die niemand benutzt. –

+0

Wenn icanon ausgeschaltet wird, wird die Eingabe sofort verarbeitet, ohne auf eine neue Zeile warten zu müssen. Versuchen Sie das Skript ohne es, und Sie werden feststellen, dass Lese wartet, nicht wegen der Lese-Timeout, sondern weil es keine Zeilenschaltung ist. –

Verwandte Themen