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?
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?
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.
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.
Ctrl+D
significa Ctrl e de capital D ou que não importa?Ctrl+Shift+D
eCtrl+D
enviam o mesmo caractere de qualquer maneira (caractere número 4, geralmente chamadoCtrl+D
).Seu segundo ponto reúne duas coisas completamente diferentes.
Você está procurando o último.
fonte
read(2)
syscall.