LINUX.ORG.RU

Остановка выполнения скрипта по кнопке (слушать STDIN в течение всего скрипта)

 


0

1

Доброго времени суток, знатоки. Нужен совет. Есть основной скрипт, в ходе которого идет взаимодействие с пользователем в формате «нажмите y/n» (т.е. stdin уже используется). Нужно, чтобы по нажатию на задаваемую кнопку клавиатуры основной скрипт прерывал работу.

Как я попытался это реализовать: двумя способами, с помощью read и с помощью grep (а, и еще попробовал с помощью stty - начиная с stty -echo -icanon time 0 min 0, но тоже не получилось).

Проблема с grep (grep -q <кнопка>) получается в том, что основной поток уходит в цикл с grep`ом, и естественно, на нем зацикливается, когда мне нужно, чтобы основной скрипт двигался своим путем, а STDIN все время работы скрипта слушался на предмет нажатия заданной клавиши. С read в итоге все это вылилось вот в такую небольшую штуку:

breakByButton()
{
while ! [ "$z" = "11" ]
do
    read -t 1 -n 1 key

    if [[ $key = <желаемая кнопка> ]]
    then
		echo -e "\n\e[31mStopped by user\e[0m"
		break
    fi
done
}

Разумеется, данная функция работает тоже только там, где ее вызвали, а в фоне, как и с grep, выполнение прерывается после первого нажатия на Enter. Сейчас думаю над распараллеливанием процессов - скрипта и read`а, но решения у меня пока так и нет. Буду благодарен за корректировку моих вариантов либо предложение более элегантных и правильных решений - словом, любую помощь.



Последнее исправление: nonrandompasser (всего исправлений: 2)

Нужно, чтобы по нажатию на задаваемую кнопку клавиатуры основной скрипт прерывал работу

если скрипт запускается из X window systemd, то проще всего сделать так:

Основной скрипт запускает ПАРАЛЛЕЛЬНО (с помощью амперсанда) другой скрипт, который, собственно, взаимодействует с пользователем, а также третий скрипт (или однострочную команду), который(я) биндит (и, как результат, перехватывает) определенную клавишу (скорее всего это будет комбинация клавиш) на «kill pid». Получить pid проще простого. И да, не забыть после «нажатия» сделать unbind

А вообще, чем тебе Ctrl+c не угодил?

reprimand ★★★★★
()

Лорчую предыдущего оратора. Чем Ctrl+C не угодил? SIGINT вполне универсален.

nexfwall ★★★★
()

в ходе которого идет взаимодействие с пользователем в формате «нажмите y/n»

НАЗВАНИЕ ПРОГРАММЫ: ПРОЩАЙ, РЕАЛЬНЫЙ МИР.
     ДАТА: 20. 08
     СОДЕРЖАНИЕ: ЗАВЕЩАНИЕ, РАЗНОЕ.
     ПРОГРАММИСТ: ЧАРЛЬЗ КЛЮГ
     ДЛЯ ВКЛЮЧЕНИЯ ПРОГРАММЫ
     НАЖМИТЕ ВВОД _

     В конце предложения мерно пульсировал маленький черный квадратик. Позже
я узнал, что он называется «курсор».
     Все собрались вокруг машины. Хал,  специалист  по компьютерам, пояснил,
что многие дисплейные устройства стирают изображение, оставляя экран пустым,
если в  течении  десяти  минут никто не меняет выведенную на нем информацию.
Делается  это для  того, чтобы  экран  дисплея не  выгорал там, где светятся
слова. До того как я  коснулся клавиши, экран был зеленым, а потом появились
черные буквы на голубом фоне.
     — Клавиатуру проверяли на отпечатки пальцев? — спросил Осборн.
     Никто толком  не знал, поэтому Осборн взял карандаш и ластиком  на  его
конце нажал клавишу «ВВОД».
     Текст с экрана исчез, голубой фон заполнили маленькие овальные фигурки,
падающие сверху, словно дождевые  капли. Сотни и сотни фигурок  самых разных
цветов.
     — Это же пилюли, — удивленно  произнес один из  полицейских.  — Вот,
смотрите, «Кваалуд»! А это «Нембутал»!
     Все наперебой принялись  называть  лекарства.  Я  сам сразу узнал белую
капсулу с красным ободком — наверняка «Дилантин». Вот уже несколько лет как
я принимаю их каждый день.
     В конце  концов дождь  из пилюль прекратился, и  эта дьявольская машина
принялась наигрывать «Все ближе к тебе, мой Господь» в  три инструментальные
партии.
     Некоторые из нас рассмеялись. Не думаю,  что  хоть кому-то происходящее
показалось  забавным, но эта мрачная панихида звучала словно аранжировка для
свистка, каллиопы и дудки. Как тут не засмеяться?
     Пока играла музыка, в  левом краю экрана появилась маленькая, сложенная
из квадратиков фигурка.  Подергиваясь,  она  двинулась к центру. Изображение
напоминало человечка из видеоигры, только выполнено оно было похуже, и чтобы
узнать в фигурке человека, требовалось напрячь воображение.
     Потом  в  центре  экрана  появился   еще  какой-то  предмет.  Человечек
остановился напротив него, согнулся, и под  ним возникло что-то напоминающее
стул.
     — А что это такое?
     — Компьютер, наверное.
     Похоже, это действительно был компьютер, потому  что  человечек вытянул
вперед  руки и  задергал ими,  как пианист у рояля. Человечек печатал, а над
ним появлялись слова.

     ГДЕ-ТО В ПУТИ Я ЧТО-ТО УПУСТИЛ. Я СИЖУ
     ЗДЕСЬ ДНЯМИ И НОЧАМИ, КАК ПАУК
     В ЦЕНТРЕ СВОЕЙ ПАУТИНЫ... Я ХОЗЯИН ВСЕГО
     ОБОЗРИМОГО... И ВСЕ ЖЕ ЭТОГО НЕДОСТАТОЧНО.
     ДОЛЖНО БЫТЬ БОЛЬШЕ.

     ВВЕДИ СВОЕ ИМЯ _

     —  Боже, —  произнес Хал. — Невероятно... Интерактивное предсмертное
письмо...
     — Надо узнать, что дальше.
     Я стоял ближе всех к клавиатуре,  так  что  я  и  набрал свое имя.  Но,
подняв глаза, увидел, что сделал опечатку, и получилось «ВИКТ9Р».
     — Как исправить? — спросил я.
     — Зачем? — сказал Осборн, протянул руку и нажал клавишу «ВВОД».

     ЗНАКОМО ЛИ ТЕБЕ ТАКОЕ ЧУВСТВО, ВИКТ9Р?
     ТЫ РАБОТАЕШЬ ВСЮ ЖИЗНЬ, ЧТОБЫ УМЕТЬ
     ДЕЛАТЬ ТО, ЧТО ТЫ ДЕЛАЕШЬ, ЛУЧШЕ
     ДРУГИХ, НО ОДНАЖДЫ ТЫ ВДРУГ ПРОСЫПАЕШЬСЯ
     И НЕ МОЖЕШЬ ПОНЯТЬ, ЗАЧЕМ ВСЕ ЭТО.
     СО МНОЙ ИМЕННО ТАК И ПРОИЗОШЛО.

     ХОЧЕШЬ УЗНАТЬ ДАЛЬШЕ, ВИКТ9Р?
     ДА/НЕТ _

     Текст лился нескончаемым потоком. Клюга это, видимо, смущало, во всяком
случае, после каждого периода из сорока —  пятидесяти  слов он предоставлял
читателю выбор «ДА/НЕТ».
anonymous
()

Используй Ctrl+c, как уже говорили выше. Если надо повесить какое-то действие перед выходом по Ctrl+c, то читай Traps.

NeXTSTEP ★★
()

чтобы по нажатию на задаваемую кнопку клавиатуры

stty intr кнопка
DonkeyHot ★★★★★
()
Ответ на: комментарий от NeXTSTEP

Ctrl+C не всегда прерывает скрипт сразу. Нашел решение на stackoverflow - да, trap. Странно, что не нагуглил trap вчера, когда искал информацию по этому поводу.

Всем спасибо.

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