Como sinalizar o final da entrada stdin


82
  1. No Bash, aprendi que o sinal final pode ser alterado por este documento. Mas, por padrão, como posso sinalizar o final da entrada stdin?
  2. Por acaso, descobri que, com cat e chardet, suas entradas stdin podem ser sinalizadas como finalizadas por Ctrl + d. Mas me lembro que Ctrl + d e Ctrl + c são semelhantes ao final da execução de um comando em execução. Então, eu estou errado?

Respostas:


114

Ctrl+D, quando digitado no início de uma linha em um terminal, significa o final da entrada. Este não é um sinal no sentido unix: quando um aplicativo está lendo no terminal e o usuário pressiona Ctrl+D, o aplicativo é notificado de que o final do arquivo foi atingido (como se estivesse lendo um arquivo e tivesse passado o último byte).

Ctrl+Cenvia um sinal, SIGINT . Por padrão, o SIGINT (o sinal de interrupção) mata o aplicativo em primeiro plano, mas o aplicativo pode capturar o sinal e reagir de uma maneira diferente (por exemplo, o próprio shell captura o sinal e interrompe a linha que você começou a digitar, mas não ' Para sair, mostra um novo prompt e aguarda uma nova linha de comando).

Você pode alterar os caracteres associados ao final do arquivo e ao SIGINT com o sttycomando, por exemplo, stty eof acriaria ao caractere de fim de arquivo e stty intr ^-desabilitaria o caractere SIGINT. Isso raramente é útil.


Obrigado! Será que Ctrl+Dsignifica Ctrl e de capital D ou que não importa?
Tim

5
@ Tim: é minúsculo que você deseja ... a convenção de escrever comandos do teclado com maiúsculas ocorre porque os rótulos do teclado estão sempre em maiúsculas e o que está sendo descrito é uma SEQUÊNCIA-CHAVE, não o código de caracteres real que o programa vê. Sim, isso às vezes é confuso.
Caleb

@ Caleb: Obrigado! Como alguém deve especificar que a chave está em maiúscula? Ou há sempre esse caso?
Tim

@ Tim Em um terminal, as combinações de teclas Ctrl+Shift+De Ctrl+Denviam o mesmo caractere de qualquer maneira (caractere número 4, geralmente chamado Ctrl+D).
Gilles

2
@ Tim O terminal recebeu Ctrl + D. Não envia um caractere para o programa. O que acontece é que, quando o programa lê do terminal, o terminal diz "este é o final do arquivo", o mesmo que quando um programa tenta ler após o final do arquivo do disco. O shell não está envolvido.
Gilles

23

Seu segundo ponto reúne duas coisas completamente diferentes.

  • Ctrl + C envia um sinal de interrupção para o processo em execução.
  • Ctrl + D envia um caractere de fim de transmissão .

Você está procurando o último.


7
Potencial de confusão aqui: da perspectiva do aplicativo, nenhum caractere real é enviado para ^ D. O que significa que o aplicativo não recebe esse caractere do read(2)syscall.
ulidtko
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.