Qual é a diferença entre ^ C e ^ D para o terminal UNIX / Mac OS X?

61

Quando tento parar alguma coisa, uso ^Ce às vezes ^Dno terminal.

Qual a diferença entre os dois? Por que algum programa não responde ^C, mas ^D. Por que o Terminal.app é encerrado quando uso ^D?

prosseek
fonte
FYI: Consulte as páginas da Wikipedia para: caractere de END OF TEXT U + 0003 produzido por Control + C e caractere de END OF TRANSMISSION U + 0004 produzido por Control + D.
Basil Bourque

Respostas:

60

CtrlCinforma ao terminal para enviar um SIGINTao processo atual em primeiro plano, que por padrão se traduz em encerrar o aplicativo. CtrlDinforma ao terminal que ele deve registrar um EOF na entrada padrão, que o bash interpreta como um desejo de sair.

Ignacio Vazquez-Abrams
fonte
62

Ctrl+ D( ^D) significa final do arquivo . Funciona apenas no início de uma linha (estou simplificando um pouco) e não tem efeito se o programa não estiver lendo as entradas do terminal. Em seu experimento, ^Ddisse ao shell que você não digitaria mais nenhum comando, então ele saiu; então o terminal saiu porque seu subprograma terminou.

Ctrl+ C( ^C) significa "interromper", ou seja, pare o que você está fazendo. Tecnicamente, pressionar pressiona ^Cenvia o sinal INT , que por padrão encerra um aplicativo, mas que em muitos programas significa voltar ao nível superior (por exemplo, em um shell, pare de digitar uma linha de comando e volte a um prompt primitivo).

Se um programa não responder ^C, você pode tentar Ctrl+ \( ^\). Isso envia o sinal QUIT , que por padrão encerra um aplicativo e que não são interceptados por tantos programas.

Outra tecla que envia um sinal é Ctrl+ Z( ^Z). Ele envia o sinal TSTP , que interrompe o programa em execução em primeiro plano. (TSTP é a abreviação de "terminal stop"; é semelhante a STOP, mas o TSTP pode ser ignorado, enquanto STOP não pode.) No shell, você pode retomar a execução desse programa com o fgcomando (resume em primeiro plano) ou o bgcomando (resume em fundo).

Todas essas chaves podem ser alteradas com o sttycomando Alguns programas, principalmente os de tela cheia que possuem ligações de teclas, os desativam.

Gilles 'SO- parar de ser mau'
fonte
Uma pequena correção: o Control-Z envia o sinal TSTP (parada do terminal). Isso pode ser capturado ou ignorado pelos processos, enquanto o sinal STOP não pode ser.
Chris Page
Precisava disso! que foi preso, e eu não podia sair
ahnbizcad
11
Apenas uma sugestão sobre CTRL-D: significa "liberar a entrada que eu digitei até agora" e se a linha estiver vazia, então read () retornará com zero e isso será interpretado como "fim do arquivo".
Luca5 /
Esta é uma informação super importante e útil; Obrigado pela explicação abrangente e clara
iono
Sendo curioso, por que o programa python executado no shell não fecha com ctrl + c, em vez disso, solicita KeyboardInterrupt? Ele sai com ctrl + d (se no início de uma linha) e com ctrl + \.
Rick
2

Adicionando as 2 respostas realmente boas acima, aqui está um exemplo:

Se você digitar pythono shell, ele será direcionado para o prompt >>> do python.

Agora, se você pressionar Ctrl+C, ele dirá KeyboardInterrupte permanecerá no >>>.
Se você entrar em um loop for, por exemplo, digitando for x in (text):-o, espera que você digite mais, mostrando um prompt ..., se você pressionar Ctrl+Cagora, ele sairá da instrução for e retornará para o prompt >>>
Se você pressionar Ctrl+Da qualquer momento, seja em >>> ou ..., sairá do prompt do python e retornará ao shell original.

Da mesma forma, se transferido para outra máquina, a Ctrl+Cencerrará todos os comandos existentes, Ctrl+Dfará isso e sairá da máquina também. (Além disso, a Deletechave é a mesma que a Ctrl+D)

Siddhartha
fonte
Agradeço esta resposta. No entanto, encontrei algumas imprecisões ao tentar fazer isso sozinho. Enquanto ssh'ed em uma máquina remota e executando o processo python, Ctrl + D saiu do python e me levou de volta ao prompt da máquina remota, mas não saiu da máquina. Além disso, a tecla Delete não funcionou da mesma forma que Ctrl + D em nenhum caso, executando python, no prompt remoto ou no meu prompt local. Parecia não fazer nada, exceto excluir caracteres na digitação em python, é claro. No entanto, Ctrl + D agiu como a tecla Delete ao digitar, e excluiu caracteres.
precisa saber sobre o Stack Overflow
11
Isso é interessante, acho que pode depender do tipo de shell que você está usando (bash, ksh etc.).
Siddhartha