LINUX.ORG.RU

bash скрипт


0

1

Можно ли как то при помощи bash скрипта отследить нажатие клавиш
Ctrl+Shift ? Что бы можно было запустить скрипт в фоне и при нажатии на Ctrl+Shift на консоль выводилось сообщение.

★★

В консоли - нет. Так как скрипт по условиям задачи работает на фоне, он не обрабатывает stdin (стандартный ввод, клавиатуру), а значит никак не може реагировать на нажатие клавиш. Уверен что на c++ такое сделать можно с помощью перехватов каких-то вызовов.

Телепатирую что ты все равно работаешь в иксах. Значит перехватить комбинацию клавишь - легче. Что касается вывода на экран сообщения - можно сделать так:

mesg y

M="What you want to say"
for A in `ls /dev/pts/` ; do
  echo "$M" | write kroz pts/$A ;
done

Этот скрипт выведет сообщение в любую консоль пользователя kroz и неважно это иксы или нет (искользовал чтобы syslog-ng выводил сообщения о критических ошибках).

Теперь о перехвате комбинации клавиш.

В KDE еще проще - в System Settings есть Shortcusts And Gestures в котором Custom Shortcuts где ты можещь добавить выполнение комманды по какой-то комбинации клавиш.

Про остальные DE не скажу.

Еще есть настройки на уровне иксов. Я в свое время делал регулировку громкости звука и управление плеером XMMS (эх, какие времена были!) по дополнительным клавишам на клавиатуре. Нашел два способа. Сразу скажу что делал это давно, вроде на Слаке или на чем-то еще, так что возможно нужно будет адаптировать под текущее время. Приведу как есть, если будет непонятно - говори, буду напрягать память, разжую.

Способ 1:

Запускаем xev чтобы получить коды дополнительных клавиш
В файле /usr/X11/lib/X11/XKeysymDB находим возможные действия (actions)
Устанавливаем пакет xbindkeys
Создаем ~/.Xmodmap . У меня такой:

keycode 227 = XF86AudioLowerVolume
keycode 223 = XF86AudioRaiseVolume
keycode 222 = XF86AudioPause

Создаем ~/.xbindkeysrc . У меня такой
"aumix -v -1"
XF86AudioLowerVolume
"aumix -v +1"
XF86AudioRaiseVolume
"xmmsctrl pause"
XF86AudioPause

Правим ~/.xinitrc file. После этого

if test "$XSESSION_IS_UP" != "yes" ; then

добавляем:

test -r $HOME/.xbindkeysrc  && xbindkeys

Перегружаем X

Способ 2:

Получаем кода клавиш с помощью xbindkeys -k или xbindkeys --key
	
Пропускаем все что написано выше (кроме установки xbindkeys в автозагрузку) и просто создаем ~/.xbindkeyrc с таким содержанием:
	
"aumix -v -1"
m:0x0 + c:227
"aumix -v +1"
m:0x0 + c:223
"xmmsctrl pause"
m:0x0 + c:222

# Ctrl
"xmmsctrl time -5"
m:0x4 + c:227
"xmmsctrl time +5"
m:0x4 + c:223
"xmmsctrl play"
m:0x4 + c:222

# Alt
"xmmsctrl previous"
m:0x8 + c:227
"xmmsctrl next"
m:0x8 + c:223
"xmmsctrl stop"
m:0x8 + c:222

Пробуй.

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

Kroz спасибо за помощь
я не написал, но имел ввиду именно текстовый, а не графический режим.

v4567 ★★
() автор топика

Никак, тк ctrl/shift — это модификаторы, они не генерируют кода при нажатии. Разве что, читать /dev/input/event* от рута, например.

uzbl
()

Конечно, костыли, но, может, наведут на правильную мысль:

1) Ставим xbindkeys, прикручиваем к нужной комбинации клавиш запуск самописной проги, освобождающую некий семафор.

2) Stdout скрипта, запущенного в терминале заправлен в другую самописную прогу, которая ждет освобождения вышеупомянутого семафора, занимает его, потом сливает весь свой stdin в stdout пока в нем что-то есть и переходит в первоначальное состояние.

segfault ★★★★★
()
Ответ на: комментарий от babusha

Тоже интересует

Можно же. Actkbd.

Для доступа програмы Actkbd к /dev/input без рутовых прав.

Создать дополнительную группу.

groupadd devinput
Пользователя добавить в эту группу.
usermod ...

Изменить правила udev чтобы файлы в /dev/input создавались с нужной группой.

/lib/udev/rules.d/26:50-udev-default.rules

Найти это

KERNEL=="mouse*|mice|event*",   NAME="input/%k", MODE="0640"
Заменить на это
KERNEL=="mouse*|mice|event*",   NAME="input/%k", MODE="0660", GROUP="devinput"

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