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

В соответствии с предложением «триплет», Самуэль, я отредактировал здесь свой вопрос, заменил предыдущий, который сбивал с толку, надеясь, что этот новый раунд будет более нестабильным.

Вопрос может заключаться в том, как слить любой тип впереди в stdin перед выдачей последовательности запросов / ответов в эмулятор терминала.

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

Вот сценарий

 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 букву команду «а», а затем делать это медленно, один раз в секунду.

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

Печатая один раз в секунду

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

Печатая 'а 'так быстро, как я могу получить.

 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

Итак, вопрос, каким образом истощить ввод, чтобы удалить нежелательный тип впереди.

1 Ответ

0 голосов
/ 20 января 2019

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