Ещё можно читать по символу командой "read -N 1" в цикле.
Итоговое сообщение слепить из введенных символов.


12 октября 2013 г., 0:13 пользователь Dmitry Alexandrov
<[email protected]>написал:

> > так вот, есть какой-то способ считывать пользовательский ввод в течение
> > этих 15 секунд с сохранением результатов, если энтер жмакнуть юзер не
> > успел?
>
> На Баше как таковом, полагаю, способа нет. Если нет возможности собрать
> альтернативную read'у читалку ввода из кода на Си, то могу предложить
> только
> поиграться с терминалом:
>
> #!/bin/bash
>
> TIMEOUT=150 # 15 s
>
> STTY=$(stty -g)
> stty intr '' -icanon min 0 time $TIMEOUT ignbrk -brkint isig
> read
> echo
> echo "$REPLY"
> stty $STTY
>
> У меня это работает, но что будет работать везде, гарантировать нельзя.
>
> On Friday October 11 2013 22:43:48 dimas <[email protected]> wrote:
> > всем привет!
> > хочется в одной приблуде реализовать "режим чата", суть которого в
> > следующем: раз в 15, допустим, секунд проверяем наличие новых сообщений.
> > в течение этого времени юзер может вводить свой текст, а по нажатию
> энтера
> > - отправлять.
> > если получили новое сообщение - сохраняем в переменной то, что наш юзер
> > успел набрать, очищаем строку (с этим разобрался, вроде), выводим его,
> > после него выводим юзерский ввод и даем ему писать дальше (что-то типа
> > read -i "набранный текст").
> > так вот, проблема как раз в том, чтобы запомнить то, что юзер успел
> набрать
> > за отведенное время.
> > банальный read -t15 сохраняет результат только при получении целой строки
> > (т.е. по нажатию энтера), если не успел - извини, ниче не знаю. причем
> > введенный текст он потом выплевывает в консоль, но перехватить этот вывод
> > у меня никак не получилось (а может, и не выплевает, а это глюк баша,
> > потому как текст появляется после приглашения, надо проверить strace'ом)
> > так вот, есть какой-то способ считывать пользовательский ввод в течение
> > этих 15 секунд с сохранением результатов, если энтер жмакнуть юзер не
> > успел?
> >
> > альтернативные реализации зело непросты (типа как с помощью screen/tmux
> > разбить окно пополам, но тогда нужно в них запускать отдельные скрипты,
> > которые непонятно как должны между собой общаться. и прочее в таком духе,
> > тянущее еще лишние зависимости). зачем писать такое на баше - отдельный
> > вопрос. скорее для творческого саморазвития, интересно уже))
>

Ответить