Отключение пользовательского ввода во время бесконечного цикла в bash

У меня есть скрипт 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
} 

2 ответа

Решение

Использование 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
Другие вопросы по тегам