Запобігати зупинці команди при натисканні CTRL + C


28

Отже, я грав на Zork 1 і пішов скопіювати текст, щоб показати мого друга, але я випадково забув утримувати клавішу Shift, коли натискав CTRL+ C. Це зупинило команду, і я втратив свої дані Zork ...

Чи є якась "корисна" підказка, яку я можу використовувати, щоб запобігти зупинці команди при натисканні клавіш CTRL+ C?

Зауважте, що Zork працює всередині терміналу. Це термінальна гра, в якій ви даєте команди для виконання різних дій.


Отже, ви хочете, щоб Ctrl + c взагалі запобігав завершенню всіх програм? Але це може бути катастрофічним у майбутньому.
Jobin

Відповіді:


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і таке.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.