Zapobiegaj zatrzymywaniu się poleceń po naciśnięciu CTRL + C

28

Grałem więc w Zork 1 i zacząłem kopiować tekst, aby pokazać mojemu przyjacielowi, ale przypadkowo zapomniałem przytrzymać klawisz Shift, naciskając CTRL+ C. To zatrzymało polecenie i straciłem dane Zork ...

Czy istnieje jakaś „pomocna” wskazówka, której mogę użyć, aby zapobiec zatrzymaniu polecenia po naciśnięciu klawiszy CTRL+ C?

Zauważ, że Zork jest uruchamiany wewnątrz terminala. Jest to gra terminalowa, w której wydajesz polecenia do wykonywania różnych czynności.


źródło
Czy chcesz, aby Ctrl + c uniemożliwiał całkowite zakończenie wszystkich aplikacji? To może być katastrofalne w przyszłości.
Jobin

Odpowiedzi:

30

Kombinacja klawiszy Ctrl+ Cwysyła znak ^C(wartość bajtu 3). Powoduje to, że terminal wysyła sygnał SIGINT do programu działającego na pierwszym planie¹. Konwencjonalne działanie dla tego sygnału polega na przerwaniu bieżącego polecenia: programy zaprojektowane do przetwarzania kolejnych poleceń wracają do wiersza najwyższego poziomu, podczas gdy programy zaprojektowane jako pojedyncze polecenie wsadowe lub ciągłe wyjście z interakcji. Najwyraźniej program, którego używasz, został zaprojektowany zgodnie z drugim modelem.

Ten klucz wysyłania sygnału jest cechą ogólnego interfejsu terminala w jądrze, wspólnym dla wszystkich emulatorów terminali i rzeczywistych terminali fizycznych. Możesz skonfigurować, który klucz wysyła ten sygnał, a także inne klucze (w szczególności CtrlZwysyłanie SIGSTOP w celu zawieszenia programu pierwszego planu) za pomocą sttypolecenia. Aby przełączyć klawisz SIGINT na Ctrl+ _(w bieżącym terminalu):

stty intr '^_'

Aby całkowicie to wyłączyć:

stty intr ''

Aby zresetować wszystkie ustawienia do wartości domyślnych:

stty sane

Klucz nie może być dowolną kombinacją klawiszy, musi to być wartość jednobajtowa. sttyUstawienie może zostać zastąpione przez programy - niektóre programy (zwłaszcza programy tryb tekstowy pełnoekranowe) robić swoje przetwarzania skrótu klawiaturowego.

¹ Dokładniej , dla wszystkich procesów w grupie procesów pierwszego planu , dla których terminal jest terminalem sterującym .

Gilles „SO- przestań być zły”
źródło
32

CTRL+ Cwysyła sygnał przerwania ( SIGINTczyli sygnał numer 2) do zadania na pierwszym planie. Możesz to wyłączyć poprzez „wychwytywanie” sygnału za pomocą trap '' 2polecenia przed uruchomieniem Zork.

Ponownie włącz CTRL+ C(odwiń SIGINT) za pomocą trap 2.

Wskazówka : możesz dodać coś takiego do ~/.bashrc:

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

W ten sposób nigdy nie zapomnisz o wyłączeniu i ponownym włączeniu sygnału, a łatwiej jest rozpocząć grę, wpisując zorkterminal.

Uwaga : możesz użyć nazwy sygnału zamiast numeru, jeśli jest to dla ciebie wygodniejsze, tj . trap '' sigintLub trap '' int. Jestem przyzwyczajony do używania liczb, np. W kill -9i tak dalej.

kraxor
źródło