2017-01-07 3 views
0

habe ich ein sh-Skript wie folgt aus:Wie drucken nicht Escape-Sequenz in Terminal

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

Ich meine, dass ich Eingabe über die Tastatur (Pfeiltasten) nehmen, dann tun Sie etwas (ex: sleep 1). Mein Problem ist, wenn ich die Pfeiltasten schnell drücken, read kann nicht meine Eingabe (es verarbeitet), und Escape-Sequenz zeigt im Terminal. Das ist nicht meine Erwartung. Wissen Sie, wie Sie dieses Problem verhindern können?

Wenn ist, ist schwer zu verstehen, werde ich wie unten erklären:

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 

Antwort

0

Es gibt mehr als ein Problem, aber die mit zu beginnen ist, dass Ihr read Befehl nur eine Zeichen gelesen wird, während Pfeil-Tasten häufig mehr als eins senden. Sie verwenden offenbar bash, die die -n Option für read als

  -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. 

Die übliche (bash spezifisch) Ansatz dokumentiert ein Timeout wäre verwenden, auch für read dokumentiert:

  -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.   

Während das alternative Skript schläft, befindet sich das Terminal wieder im Echo-Modus. Anstatt die (manchmal hilfreichen) Bash-Funktionen zu verwenden, wäre der übliche Ansatz, die Terminalmodi mit stty zu manipulieren und in den Nicht-Echo-Modus zu versetzen sowie die Timeouts zu reduzieren. B. How to display the key pressed by the user?

+0

Vielen Dank. Mit "stty -echo" ist das Problem zu lösen. – Thepro

Verwandte Themen