Отключение пользовательского ввода во время бесконечного цикла в 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