2014-10-01 15 views
5

Ho questo script bash che fondamentalmente avvia i server web e selenio con indicatore di avanzamento. Poiché ci vuole del tempo per avviare il server di selenio, sto controllando lo stato in un ciclo infinito.Disabilitare l'input dell'utente durante un loop infinito in bash

Il problema è che, mentre aspetto che si avvii, premo accidentalmente che i tasti vengano visualizzati sullo schermo e se il ciclo termina (va in time out) viene visualizzato anche nel prompt dei comandi.

voglio disattivare tutti gli input dell'utente (tranne i tasti di controllo naturalmente) mentre all'interno del ciclo:

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 
} 

risposta

6

Usa stty per disattivare l'input dalla tastiera.

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

-echo disattiva input della tastiera e stty echo riattiva ingresso tastiera.

+0

Oh, ho pensato che ti disabilitare tutti eco avrei provato prima ... Grazie ... – madpoet

+0

Questo non funziona esattamente. Disattiva solo l'eco. Tutto ciò che è dattilografato è ancora lì, solo invisibile. –

+0

Sì. Voleva disabilitare la visualizzazione delle pressioni accidentali dei tasti, giusto? – Fazlin

5

Le invocazioni stty provengono http://www.unix.com/shell-programming-and-scripting/84624-nonblocking-i-o-bash-scripts.html

Questo rispetta ancora Ctrl-C, ma non mostra ingresso, e consuma quindi non è lasciato per il guscio.

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

Quindi quello che hai fatto qui è ; con 'stty time 0 min 0' si imposta il timeout di lettura e min. char a 0 per evitare 'read' dal bloccare l'IO e semplicemente leggere l'input e andrà da nessuna parte. È giusto? Non capisco l'uso di -icanon e non hai bisogno di intercettare SIGINT ed eseguire il 'stty sane' lì? – madpoet

+0

A destra, l'input va a una variabile chiamata "line", che nessuno usa. –

+0

Disattivare icanon significa che l'input verrà elaborato immediatamente, senza dover attendere una nuova riga. Prova lo script senza di esso, e scoprirai che le attese di lettura, non a causa del timeout di lettura, ma perché non c'è una nuova riga. –