LINUX.ORG.RU

Ожидание пользовательского ввода до момента ввода определенного символа


0

1

Добрый день! Не подскажете, как можно реализовать в скрипте на bash следующее :

while [Пользователь не ввел [определенный символ, например Enter] ]
sleep
без использования read. Заранее большое спасибо!


Ответ на: комментарий от Masha

ОМG... Ну перехватывай дескриптор родительского терминала (поиском по /proc, например). Только я этого не предлагал.

anonymous
()
Ответ на: комментарий от anonymous

Ну а вообще,если задача состоит в том,чтобы выполнять какие-то действия, пока пользователь не ввел определенный символ, как может быть решена? Как получить к примеру, код клавиши «Enter»?

Masha
() автор топика
Ответ на: комментарий от Masha

Запустить действия в фоне, прочитать один символ (read -sn1 в баше) - в зависимости от символа прервать фоновый процессы.

anonymous
()
Ответ на: комментарий от Masha

Маша, мне лень перечитывать все твои треды, но представь себе следующую ситуацию:

Пользователь твоего пакета — сисадмин. В маленькой конторке. Всего пара сотен машин. И ему надо установить твой софт на все машины. А чтобы хоть что-то поставить, надо на каждой машине жать кнопки на клавиатуре.

Его действия?

Для конфигурации придуманы конфигурационные файлы. Для диалога с пользователем придуманы диалоги (да, в общем с 70-х годов появились даже графические интерфейсы).

Никто тебе не мешает этап конфигурации оформить в виде диалога, но результатом оного должен быть файл конфигурации, который можно скормить (самым автоматизируемым образом) твоему установщику.

Сам установщик должен действовать полностью автоматически. Не надо делать очередную винду с «Next» или дебиан с dpkg-reconfigure.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо! «Запустить действия в фоне, прочитать один символ (read -sn1 в баше) - в зависимости от символа прервать фоновый процессы.

anonymous» а как получить код символа?()как распозать символ,например Enter)

Masha
() автор топика

определенный символ, например Enter

Что характерно, read как раз и ждет ентера :). Но в переменную он его не засунет - обрезает непечатные символы. Так что можно так:

stop="какой-то печатный символ"
while read -n 1 -t 1; [ "$REPLY" != "$stop" ]
do
sleep 1;
done

А вообще man dialog. Там и окошки можно рисовать и менюшки, и таймауты задавать, и pid он может выдать. Например.

vahtu
()
Ответ на: комментарий от vahtu

У Вас этот скрипт работал?Что-то у меня

while read -n 1 -t 1; [ "$REPLY"!="$stop" ]
do
sleep 1
read input
echo -e "Input value\\n"
done
echo "$input"

Ввожу 1q и скрипт висит.

Input value

1q

Masha
() автор топика
Ответ на: комментарий от Masha

1. Зачем второй read?

2. Вместо sleep должна быть какая-то полезная работа.

И, кстати, для read в условии можно задать -t 0.001, чтобы read не ждал.

или я не правильно понял: требовалось ведь что-то делать, учитывая нажатия клавиш пользователя?

vahtu
()
Ответ на: комментарий от Masha

man showkey, но это не поможет. В любом случае bash его «съест».

vahtu
()
4 мая 2013 г.

Пример read -n 1 -p "(нажмите любую клавишу для продолжения)" AMSURE

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.