2017-01-07 3 views
0

У меня есть ш скрипт так:Как не печатать избежать последовательности в терминале

while true 
    do 
read -sn1 input 
<do something> 
done 

Я имею в виду, что я буду принимать ввод с клавиатуры (клавиши со стрелками), а затем сделать что-то (например: сон 1). Моя проблема заключается в том, что я быстро нажимаю клавиши со стрелками, read не может принимать мои данные (это обработка) и отображать последовательности выходов в терминале. Это не мое ожидание. Вы знаете, как предотвратить эту проблему?

Если это трудно понять, я объясню, как показано ниже:

read -sn1 input <-- press arrow key 
sleep 1 
.     <-- press arrow key ==> display escape sequence in terminal 
. 
. 
read -sn1 input <-- maybe take input from above key press 

ответ

0

Там больше, чем одна проблема, но один, чтобы начать с, что ваша команда read будет читать только один характер, в то время как клавиши со стрелками обычно отправляют более одного. Вы, по-видимому, используя bash, каких документы варианта -n для read как

  -n nchars               
       read returns after reading nchars characters rather than 
       waiting for a complete line of input, but honor a delim‐ 
       iter if fewer than nchars characters are read before the 
       delimiter. 

обычного (Баш-специфического) подхода будет использовать тайм-аут, также документированный для read:

  -t timeout               
       Cause read to time out and return failure if a complete 
       line of input is not read within timeout seconds. time‐ 
       out may be a decimal number with a fractional portion 
       following the decimal point. This option is only effec‐ 
       tive if read is reading input from a terminal, pipe, or 
       other special file; it has no effect when reading from 
       regular files. If timeout is 0, read returns success if 
       input is available on the specified file descriptor, 
       failure otherwise. The exit status is greater than 128 
       if the timeout is exceeded.   

В прошлом, когда ваш альтернативный скрипт спит, терминал возвращается в эхо-режим. Вместо того, чтобы использовать функции bash (иногда полезные), обычным подходом было бы управлять режимами терминала с использованием stty, помещая его в режим без эха, а также уменьшая тайм-ауты. На это был дан ответ до, например, How to display the key pressed by the user?

+0

Большое спасибо. Используя «stty -echo», проблема решена. – Thepro

Смежные вопросы