Impedir que o comando pare ao pressionar CTRL + C

28

Então, eu estava tocando Zork 1 e copiei um texto para mostrar a um amigo meu, mas acidentalmente esqueci de segurar a tecla Shift ao pressionar CTRL+C . Isso interrompeu o comando e eu perdi meus dados do Zork ...

Existe algum tipo de dica "útil" que eu possa usar para impedir a interrupção do comando ao pressionar as teclas CTRL+ C?

Observe que o Zork é executado dentro do terminal. É um jogo baseado em terminal no qual você dá comandos para executar ações diferentes.


fonte
Então você quer que o Ctrl + c impeça a finalização de todos os aplicativos? Isso pode ser desastroso no futuro.
Jobin

Respostas:

30

A combinação de teclas Ctrl+ Cenvia o caractere ^C(valor de byte 3). Isso faz com que o terminal envie o SIGINT sinal para o programa em execução em primeiro plano¹. A ação convencional para esse sinal é interromper o comando atual: os programas projetados para processar comandos sucessivos retornam ao prompt de nível superior, enquanto os programas são projetados como um único comando em lote ou como uma saída de interação contínua. Evidentemente, o programa que você está usando foi projetado de acordo com o segundo modelo.

This signal-sending key is a feature of the general terminal interface in the kernel, shared by all terminal emulators and real physical terminals. You can configure which key sends this signal, as well as other keys (most notably CtrlZ sending SIGSTOP to suspend the foreground program) with the stty command. To switch the key for SIGINT to Ctrl+_ (in the current terminal):

stty intr '^_'

Para desativá-lo completamente:

stty intr ''

Para redefinir todas as configurações para o padrão:

stty sane

A chave não pode ser uma combinação arbitrária de chaves, deve ser um valor de byte único. A sttyconfiguração pode ser substituída por programas - alguns programas (especialmente programas em modo de texto em tela cheia) executam seu próprio processamento de atalho de teclado.

Precisely Mais precisamente , para todos os processos no grupo de processos em primeiro plano para os quais o terminal é o terminal de controle .

Gilles 'SO- parar de ser mau'
fonte
32

CTRL+ Cenvia um sinal de interrupção ( SIGINTque é o número de sinal 2) para o trabalho em primeiro plano. Você pode desativar isso "interceptando" o sinal usando o trap '' 2comando antes de iniciar o Zork.

Reative CTRL+ C(desmarque SIGINT) com trap 2.

Dica : você pode adicionar algo assim ao seu ~/.bashrc:

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

Dessa forma, você nunca esquecerá de desativar e reativar o sinal e é mais fácil iniciar o jogo apenas digitando zorkno terminal.

Nota : você pode usar o nome do sinal em vez do número, se for mais conveniente para você, trap '' sigintou seja, ou trap '' int. Estou acostumado a usar os números, por exemplo, in kill -9e tal.

kraxor
fonte