O que CTRL + 4 (e CTRL + \) faz no bash?

20

Acabei de descobrir acidentalmente que CTRL + 4 fecha programas lendo stdin de entrada da linha de comando.

É assim que aparece quando digito CTRL + 4 ou CTRL + / nos programas que leem stdin

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type 'warranty'. 
^\Quit
$

Eu recebo ^\Quit exibido e, em seguida, o programa é fechado. Qual é a diferença disso em comparação com o uso de ^C ou ^D ? O que ^\Quit faz?

Editar : Descobri que CTRL + \ faz a mesma coisa.

    
por wefwefa3 29.08.2015 / 22:14

2 respostas

35

Ctrl + 4 envia ^ \

Os terminais enviam caracteres (ou bytes mais precisos), não chaves. Quando uma tecla que representa um caractere imprimível é pressionada, o terminal envia esse caractere para o aplicativo. A maioria das teclas de função são codificadas como seqüências de escape: seqüências de caracteres que começam com o número de caractere 27. Alguns keycords da forma Ctrl + caractere e algumas teclas de função enviados como caracteres de controle - no conjunto de caracteres ASCII , que todos os computadores modernos usam como base (Unicode, ISO Latin n , etc. são todos superconjuntos de ASCII), 33 caracteres são caracteres de controle: números de caractere 0 a 31 e 127. Caracteres de controle não são imprimíveis, mas pretendem ter um efeito em aplicativos; por exemplo, o caractere 10, que é Control-J (comumente escrito ^ J), é um caractere de nova linha, portanto, quando um terminal exibe esse caractere, ele move o cursor para a próxima linha, em vez de exibir um glifo. O caractere de escape em si é um caractere de controle, ^ [(valor 27).

Não há caracteres de controle suficientes para cobrir todos os teclados Ctrl + caractere . Apenas letras e os caracteres @[\]^_? possuem um caractere de controle correspondente. Quando você pressiona Ctrl + 4 ou Ctrl + $ (que eu presumo é Ctrl + Shift + 4 ), o terminal tem que escolher algo para enviar. Dependendo do terminal e sua configuração, existem várias possibilidades comuns:

  • O terminal ignora o modificador Ctrl e envia o caractere 4 ou $ .
  • O terminal envia uma sequência de escape que codifica a chave e os modificadores exatos que foram pressionados.
  • O terminal envia algum outro caractere de controle.

Muitos terminais enviam caracteres de controle para algumas chaves na linha de dígitos:

  • Ctrl + 2 → ^ @
  • Ctrl + 3 → ^ [
  • Ctrl + 4 → ^ \
  • Ctrl + 5 ^]
  • Ctrl + 6 → ^
  • Ctrl + 7 → ^ _
  • Ctrl + 8 → ^?

Eu não sei onde esta convenção em particular surgiu.

Ctrl + | envia o mesmo caracter porque ele é Ctrl + Deslocamento + \ e o terminal envia ^ \ se a tecla shift foi pressionada ou não.

^ \ quites

O terminal em si (mais precisamente, o suporte a terminal genérico no kernel) interpreta alguns caracteres de controle especialmente. Essa interpretação pode ser configurada para mapear diferentes caracteres ou desativada por aplicativos que desejam processar os caracteres por si mesmos. Uma interpretação bem conhecida é que ^ M, o caractere enviado pela tecla Return , envia a linha atual para o aplicativo, se o terminal estiver em modo de cozimento , no qual os aplicativos recebem entrada linha por linha.

Alguns caracteres enviam sinais para o aplicativo em primeiro plano. ^ C envia o sinal de interrupção (SIGINT), que convencionalmente diz ao aplicativo para parar o que está fazendo e ler o usuário próximo comando. Aplicações não interativas geralmente saem. ^ \ envia o sinal de saída (SIGQUIT), que convencionalmente diz ao aplicativo para sair o mais rápido possível sem salvar nada ; muitos aplicativos não substituem o comportamento padrão, que é matar o aplicativo imediatamente¹. Então, quando você pressiona Ctrl + 4 (ou qualquer coisa que envie o caractere ^ \) em cat ou bc , nenhum dos quais substitui o comportamento padrão, o aplicativo é morto.

O próprio terminal imprime a parte ^\ da mensagem: é uma representação visual do caractere que você digitou, e o terminal está no modo cozido e com o eco ativado (os caracteres são exibidos pelo terminal assim que você digitá-los, ao contrário do modo não-echo, onde os caracteres são enviados apenas para o aplicativo, que pode ou não optar por exibi-los). A parte Quit vem do bash: ela percebe que seu processo filho morreu de um sinal de quit, e esse é o jeito de você saber.

Shells lidam com todos os sinais comuns, de modo que se você digitar ^ \ em um shell, você não mata a sua sessão, apenas recebe um novo prompt, igual a ^ C.

Você pode jogar com as configurações do terminal com o comando stty .

¹ E tradicionalmente gera um core dump , mas muitos sistemas desativam isso por padrão hoje em dia.

    
por 29.08.2015 / 22:53
7

Além da resposta de Gilles, deixe-me acrescentar que você sempre pode inserir caracteres não imprimíveis no bash com a tecla Ctrl-v + ( Ctrl-v + Ctrl + 4 neste caso) e verifique o código do caractere com

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

você obtém o código decimal do caractere, que como você pode verificar em man ascii corresponde ao arquivo separador (FS) .

    
por 29.08.2015 / 23:07