【问题标题】:bash tty input drain (or flush?)bash tty 输入耗尽(或刷新?)
【发布时间】:2019-01-20 12:00:28
【问题描述】:

根据三元组,塞缪尔的建议,我在这里编辑了我的问题,替换了上一个令人困惑的问题,希望新一轮会更加不稳定。

问题可能是如何在向终端仿真器发出查询/回复序列之前先在标准输入上排空任何类型。

下面的演示在脚本中模拟命令循环,读取用户“命令”,执行此操作(此处为睡眠),然后“想要”查询/回复终端模拟器(此处询问术语 ID,但您可以想象终端仿真器会接受的任何类型的查询)所以在查询/回复之前,我们必须提前排空任何类型。在这里,我尝试读取直到为空。

这是脚本

 typeset -i i=0 n=30
while((i<n))
do
  read -p "cmd: "  c          # Read user command
  sleep 1                     # emulate user command that takes time
  echo "cmd '$c' done"
  while read -s -n 1 -t .1 a  # drain type ahead
  do [ "$a" = "" ] && break;
  done
  read -s -dc -p $'\e[0c' r  # emit a terminal query and read reply.
  [ "$r" != "$gr" ] && echo "Got corrupted reply '$r' '$gr'"
  ((i++))
done

运行时输入 1 个字母的命令 'a' 然后 慢慢地,每秒一次。

将 bash BASH_VERSION='4.4.19(1)-release' 与 mate-terminal 或 xterm 一起使用,我得到了这个

每秒输入一次

cmd: a
cmdcmd 'a' done
cmdcmd: a
cmdcmd 'a' done
cmdcmd: a
cmdcmd 'a' done
cmdcmd: 

尽可能快地输入“a”。

 cmdcmd: a
cmda
cmda
cmda
cmda
cmdacmd 'a' done
cmdGot corrupted reply 'a
cmda
cmda
cmda
cmdmd: 
cmda
cmda
cmda
cmda
cmdcmd '' done
cmdGot corrupted reply 'a
cmda

所以问题是,有什么方法可以排出输入以删除不需要的类型。

【问题讨论】:

    标签: bash input flush


    【解决方案1】:

    read -d ':' _ 将读取输入直到第一个冒号。

    while read -d :
    do
      printf 'Preread: Got "%s"\n' "$REPLY"
      read -r a
      printf 'In loop: Got "%s"\n' "$a"
    done <<\_
    bad
    bad
    : good
    bad
    bad
    : good
    bad
    bad
    : good
    bad
    bad
    : good
    _
    

    输出:

    Preread: Got "bad
    bad
    "
    In loop: Got "good"
    Preread: Got "bad
    bad
    "
    In loop: Got "good"
    Preread: Got "bad
    bad
    "
    In loop: Got "good"
    Preread: Got "bad
    bad
    "
    In loop: Got "good"
    

    【讨论】:

    • 感谢 -d,它简化了测试用例,但仍然没有乐趣,仍然输入错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多