bash tty входной сток (или промывка?) (снова) - PullRequest
0 голосов
/ 27 февраля 2019

Я испортил свой предыдущий вопрос, не знаю, как это исправить, попросил модератора подавить его.Я переспрашиваю здесь мой вопрос в более простой форме, более понятной.

Как слить любой тип впереди в stdin перед отправкой последовательности запросов / ответов в эмулятор терминала из bash.

В приведенной ниже демонстрации эмулируется цикл команд в скрипте, читайте пользователя 'команда ', выполните это действие (здесь спящий режим), затем' хотели бы 'запросить / ответить эмулятору терминала (здесь запрашивается идентификатор термина, но вы можете представить любой тип запроса, который примет эмулятор терминала), так что перед запросом / ответоммы должны истощить любой тип впереди.Здесь я предпринял попытку чтения до пустого значения.

Вот сценарий

#!/bin/sh
read -s -dc -p $'\e[0c' gr # The good query reply 

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

При его запуске по приглашению 'cmd:' введите медленно и дождитесь следующего приглашения.

Используя bash BASH_VERSION = '4.4.19 (1) -release' с обоими терминалами или xterm, я получил это

TC$ ./t.sh
cmd: a
cmd 'a' done
cmd: a
cmd 'a' done
cmd: a
cmd 'a' done
cmd: 

При наборе быстрее (не ожидая приглашения) у меня тогданекоторые печатающие символы на sdtin, и я получил это, несмотря на мою неудачную попытку истощить ввод.

TC$ ./t.sh
cmd: a
a
a
a
acmd 'a' done
Got corrupted reply 'a
a
a
md: 
a
a
cmd '' done
Got corrupted reply 'a

Любой совет, как истощить ввод в a в таком bash-приложении?Приветствия

...