В соответствии с предложением «триплет», Самуэль, я отредактировал здесь свой вопрос, заменил предыдущий, который сбивал с толку, надеясь, что этот новый раунд будет более нестабильным.
Вопрос может заключаться в том, как слить любой тип впереди в 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
Итак, вопрос, каким образом истощить ввод, чтобы удалить нежелательный тип впереди.