如何在终端中不打印转义序列

时间:2017-01-07 03:12:17

标签: bash terminal sh

我有一个像这样的sh脚本:

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

1 个答案:

答案 0 :(得分: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.

通常(特定于bash)的方法是使用超时,也记录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.        

过去 - 当您的备用脚本处于休眠状态时,终端将返回echo模式。通常的方法是使用stty操纵终端模式,将其置于无回声模式,同时减少超时,而不是使用bash(有时是有用的)功能。之前已经回答过,例如 How to display the key pressed by the user?