Impedire l'arresto del comando quando si preme CTRL + C


28

Quindi, stavo giocando a Zork 1 e sono andato a copiare del testo per mostrare un mio amico, ma ho accidentalmente dimenticato di tenere premuto il tasto Maiusc quando ho premuto CTRL+ C. Questo ha fermato il comando e ho perso i miei dati di Zork ...

Esiste una sorta di "utile" suggerimento che posso usare per evitare di interrompere il comando quando premo i tasti CTRL+ C?

Si noti che Zork viene eseguito all'interno del terminale. È un gioco basato su terminali in cui dai comandi per eseguire diverse azioni.


Quindi vuoi Ctrl + c per evitare di terminare del tutto tutte le applicazioni? In futuro potrebbe essere disastroso.
Jobin

Risposte:


30

La combinazione di tasti Ctrl+ Cinvia il carattere ^C(valore byte 3). Questo fa sì che il terminale invii il segnale SIGINT al programma in esecuzione in primo piano¹. L'azione convenzionale per questo segnale è di interrompere il comando corrente: i programmi progettati per elaborare i comandi successivi tornano al loro prompt di livello superiore, mentre i programmi progettati come un singolo comando batch o un'uscita di interazione continua. Evidentemente il programma che stai usando è stato progettato secondo il secondo modello.

Questa chiave di invio del segnale è una caratteristica dell'interfaccia generale del terminale nel kernel, condivisa da tutti gli emulatori di terminale e terminali fisici reali. È possibile configurare quale tasto invia questo segnale, così come altri tasti (in particolare l' CtrlZinvio di SIGSTOP per sospendere il programma in primo piano) con il sttycomando. Per impostare la chiave per SIGINT su Ctrl+ _(nel terminale corrente):

stty intr '^_'

Per disabilitarlo del tutto:

stty intr ''

Per ripristinare tutte le impostazioni predefinite:

stty sane

La chiave non può essere una combinazione di tasti arbitraria, deve essere un valore a byte singolo. L' sttyimpostazione può essere ignorata dai programmi: alcuni programmi (in particolare i programmi in modalità testo a schermo intero) eseguono la propria scorciatoia da tastiera.

¹ Più precisamente , a tutti i processi nel gruppo di processi in primo piano per i quali il terminale è il terminale di controllo .


32

CTRL+ Cinvia un segnale di interruzione ( SIGINT, che è il segnale numero 2) al lavoro in primo piano. Puoi disabilitarlo "intrappolando" il segnale usando il trap '' 2comando prima di avviare Zork.

Riattiva CTRL+ C(untrap SIGINT) con trap 2.

Suggerimento : potresti aggiungere qualcosa del genere al tuo ~/.bashrc:

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

In questo modo non dimenticherai mai di disabilitare e riattivare il segnale ed è più facile iniziare il gioco digitando semplicemente zorkil terminale.

Nota : è possibile utilizzare il nome del segnale anziché il numero se è più conveniente per te, ovvero trap '' siginto trap '' int. Sono solo abituato a usare i numeri, ad esempio in kill -9e simili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.