Ctrl + 4 envia ^ \
Os terminais enviam caracteres (ou mais precisamente bytes), 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 é codificada como seqüências de escape: sequências de caracteres que começam com o número de caractere 27. Alguns acordes de teclas do formulário Ctrl+ charactere algumas teclas de função são enviados como caracteres de controle - no conjunto de caracteres ASCII , que todos os computadores modernos usar-se como uma base (Unicode, ISO latino n, etc. são todos os superconjuntos de ASCII), 33 caracteres são caracteres de controle: caracteres número 0 a 31 e 127. Os caracteres de controle não são imprimíveis, mas devem ter efeito nos aplicativos; por exemplo, o caractere 10, que é Control-J (geralmente 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 Ctrl+ characterteclados. Somente letras e caracteres @[\]^_?
têm um caractere de controle correspondente. Quando você pressiona Ctrl+ 4ou Ctrl+ $(que eu presumo é Ctrl+ Shift+ 4), o terminal precisa escolher algo para enviar. Dependendo do terminal e sua configuração, existem várias possibilidades comuns:
- O terminal ignora o Ctrlmodificador e envia o caractere
4
ou $
.
- O terminal envia uma sequência de escape que codifica a tecla exata e os modificadores que foram pressionados.
- O terminal envia algum outro caractere de controle.
Muitos terminais enviam caracteres de controle para algumas teclas na linha de dígitos:
- Ctrl+ 2→ ^ @
- Ctrl+ 3→ ^ [
- Ctrl+ 4→ ^ \
- Ctrl+ 5→ ^]
- Ctrl+ 6→ ^^
- Ctrl+ 7→ ^ _
- Ctrl+ 8→ ^?
Não sei onde surgiu essa convenção em particular.
Ctrl+ |envia o mesmo caractere porque é Ctrl+ Shift+ \e o terminal envia ^ \ se a tecla shift foi pressionada ou não.
^ \ encerra
O próprio terminal (mais precisamente, o suporte genérico ao terminal no kernel) interpreta alguns caracteres de controle especialmente. Essa interpretação pode ser configurada para mapear caracteres diferentes ou desativada por aplicativos que desejam processar os caracteres sozinhos. Uma interpretação bem conhecida é que ^ M, o caractere enviado pela Returntecla, envia a linha atual para a aplicação, se o terminal estiver no modo cozido , no qual as aplicações recebem entrada linha por linha.
Alguns caracteres enviam sinais para o aplicativo em primeiro plano. ^ C envia o sinal de interrupção (SIGINT), que instrui o aplicativo a interromper o que está fazendo e ler o próximo comando do usuário. Aplicativos não interativos geralmente saem. ^ \ envia o sinal de abandono (SIGQUIT), que normalmente instrui o aplicativo a sair o mais rápido possível sem salvar nada; muitos aplicativos não substituem o comportamento padrão, que é matar o aplicativo imediatamente¹. Portanto, 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 é eliminado.
O próprio terminal imprime a ^\
parte da mensagem: é uma representação visual do caractere que você digitou e o terminal está no modo de cozimento e com o eco ativado (os caracteres são exibidos pelo terminal assim que você os digita, em oposição a modo não eco, onde os caracteres são enviados apenas para o aplicativo, que pode ou não optar por exibi-los). A Quit
parte vem do bash: percebe que o processo filho morreu de um sinal de parada, e essa é a maneira de informar você.
Os shells lidam com todos os sinais comuns, de modo que, se você digitar ^ \ em um shell, não encerra sua sessão, apenas recebe um novo prompt, o mesmo que ^ C.
Você pode jogar com as configurações do terminal com o stty
comando
¹ E tradicionalmente gere um dump principal , mas muitos sistemas o desativam por padrão hoje em dia.