Запускать программу при нажатии клавиши, не перебивая ключевое событие

Можно ли связать (глобальную) клавишу нажатием какой-либо команды и по-прежнему не прерывать нажатие клавиши после завершения? Я имею в виду, если я попробую решение bindkey, размещенное в другом месте здесь :

# In file: ~/.xbindkeysrc # Bind key 'q' to running 'some_command' "some_command" q 

то нажатие клавиши «q» никогда не завершается, как в противном случае: т. е. никогда не печатает символ «q» на терминале, например.

Используя xdotool для отправки клавиши «q», нажмите так:

 # In file: ~/.xbindkeysrc # Bind key 'q' to running 'some_command' "some_command && xdotool key q" q 

приводит к циклу, так как нажатие клавиши «q», выполняемое xdotool будет выполнять другую команду «some_command» через привязку.

Чтобы быть немного яснее, я хочу, чтобы клавиша нажала «q», как обычно, и, кроме того, выполнила какую-либо внешнюю команду. Решение выше заменяет событие нажатия клавиши «q» с выполнением некоторой внешней команды. Проблема в том, что если эта внешняя команда также имитирует нажатие клавиши «q», тогда привязка перезапускает внешнюю команду, и я застреваю в бесконечном цикле.

Хорошо, поэтому я опубликую решение, которое я нашел, но, возможно, у кого-то есть лучший. После ответа, представленного здесь , я вижу все нажатые клавиши

 xinput test <keyboad_id> 

в терминале. Это просто простой случай передачи вывода этой команды в программу, которая следит за строками типа «key release 24» (вывод, когда «q» выпущен на моей клавиатуре), и который затем сделает все, что вам нравится, когда это будет сопоставить эту строку.

Например, мы можем нажать кнопку «q» и сделать звук следующим образом:

 xinput test <keyboard_id> | while read in ; do [[ $in = "key press 24" ]] && aplay /usr/share/sounds/purple/alert.wav done 

Мы можем, очевидно, следить за другими входами и запускать что-то еще, если это необходимо.