Запретить остановку команды при нажатии клавиш CTRL + C

28

Итак, я играл в Zork 1 и пошел копировать текст, чтобы показать моего друга, но я случайно забыл удерживать клавишу Shift при нажатии CTRL+ C. Это остановило команду, и я потерял свои данные Zork ...

Есть ли какая-то «полезная» подсказка, которую я могу использовать, чтобы предотвратить остановку команды при нажатии клавиш CTRL+ C?

Обратите внимание, что Zork запускается внутри терминала. Это терминальная игра, в которой вы даете команды для выполнения различных действий.


источник
Таким образом, вы хотите, чтобы Ctrl + C предотвратил завершение всех приложений? Это может иметь катастрофические последствия в будущем.
работа в

Ответы:

30

Комбинация клавиш Ctrl+ Cотправляет символ ^C(значение байта 3). Это заставляет терминал отправлять сигнал SIGINT программе, работающей на переднем плане¹. Обычным действием для этого сигнала является прерывание текущей команды: программы, предназначенные для обработки последовательных команд, возвращаются к своему приглашению верхнего уровня, тогда как программы, разработанные как одиночная пакетная команда или выход из непрерывного взаимодействия. Очевидно, что используемая вами программа была разработана в соответствии со второй моделью.

Этот ключ отправки сигнала является функцией общего интерфейса терминала в ядре, который используется всеми эмуляторами терминала и реальными физическими терминалами. С помощью команды вы можете настроить, какая клавиша отправляет этот сигнал, а также другие клавиши (прежде всего, CtrlZотправка SIGSTOP для приостановки программы переднего плана) stty. Чтобы переключить ключ для SIGINT на Ctrl+ _(в текущем терминале):

stty intr '^_'

Чтобы отключить его вообще:

stty intr ''

Чтобы восстановить все настройки по умолчанию:

stty sane

Ключ не может быть произвольной комбинацией клавиш, он должен быть однобайтовым значением. sttyУстановка может быть переопределена программами - некоторые программы (особенно полноэкранные программы в текстовом режиме) делать свои собственные обработки клавишей быстрого доступа.

¹ Точнее , ко всем процессам в основной группе процессов, для которых терминал является управляющим терминалом .

Жиль "ТАК - перестань быть злым"
источник
32

CTRL+ Cотправляет сигнал прерывания (то SIGINTесть сигнал номер 2) на задание на переднем плане. Вы можете отключить это, «перехватывая» сигнал с помощью trap '' 2команды перед запуском Zork.

Повторно включить CTRL+ C(убрать SIGINT) с помощью trap 2.

Совет : вы можете добавить что-то вроде этого в свой ~/.bashrc:

alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"

Таким образом, вы никогда не забудете отключить и снова включить сигнал, и вам будет легче начать игру, просто набрав zorkв терминале.

Примечание : вы можете использовать имя сигнала вместо номера, если это более удобно для вас, т . Е. trap '' sigintИли trap '' int. Я просто привык к использованию чисел, например, в kill -9и так далее.

kraxor
источник