[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: вопрос к знатокам баша



Читать в цикле, безусловно, можно, но я как-то не улавливаю в этом смысла. Как 
вы предлагаете разрывать его по таймауту? Можно, конечно, как-то так:

#!/bin/bash

TTY=$(tty)
sleep 15s && \
ttyecho -n "$TTY" $'\4' &

until [[ $REPLY == $'\4' ]]; do
    read -N 1
    INPUT="$INPUT$REPLY"
done

echo
echo "$INPUT"

но ttyecho — это далеко не базовая утилита, и если есть возможность собрать 
ее, то есть возможность собрать альтернативный read.


On Saturday October 12 2013 00:21:13 Павел Знаменский <kompastver@gmail.com> 
wrote:
> Ещё можно читать по символу командой "read -N 1" в цикле.
> Итоговое сообщение слепить из введенных символов.
> 
> 
> 12 октября 2013 г., 0:13 пользователь Dmitry Alexandrov
> 
> <321942@gmail.com>написал:
> > > так вот, есть какой-то способ считывать пользовательский ввод в течение
> > > этих 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 <dimas000@ya.ru> wrote:
> > > всем привет!
> > > хочется в одной приблуде реализовать "режим чата", суть которого в
> > > следующем: раз в 15, допустим, секунд проверяем наличие новых
> > > сообщений. в течение этого времени юзер может вводить свой текст, а по
> > > нажатию
> > 
> > энтера
> > 
> > > - отправлять.
> > > если получили новое сообщение - сохраняем в переменной то, что наш юзер
> > > успел набрать, очищаем строку (с этим разобрался, вроде), выводим его,
> > > после него выводим юзерский ввод и даем ему писать дальше (что-то типа
> > > read -i "набранный текст").
> > > так вот, проблема как раз в том, чтобы запомнить то, что юзер успел
> > 
> > набрать
> > 
> > > за отведенное время.
> > > банальный read -t15 сохраняет результат только при получении целой
> > > строки (т.е. по нажатию энтера), если не успел - извини, ниче не знаю.
> > > причем введенный текст он потом выплевывает в консоль, но перехватить
> > > этот вывод у меня никак не получилось (а может, и не выплевает, а это
> > > глюк баша, потому как текст появляется после приглашения, надо
> > > проверить strace'ом) так вот, есть какой-то способ считывать
> > > пользовательский ввод в течение этих 15 секунд с сохранением
> > > результатов, если энтер жмакнуть юзер не успел?
> > > 
> > > альтернативные реализации зело непросты (типа как с помощью screen/tmux
> > > разбить окно пополам, но тогда нужно в них запускать отдельные скрипты,
> > > которые непонятно как должны между собой общаться. и прочее в таком
> > > духе, тянущее еще лишние зависимости). зачем писать такое на баше -
> > > отдельный вопрос. скорее для творческого саморазвития, интересно уже))

Reply to: