¿Cuál es la diferencia entre ^ C y ^ D para el terminal UNIX / Mac OS X?

62

Cuando trato de detener algo, lo uso ^Cy, a veces, ^Den la terminal.

¿Cuál es la diferencia entre los dos? Por qué algún programa no responde ^C, pero ^D. ¿Por qué Terminal.app simplemente se cierra cuando lo uso ^D?

prosseek
fuente
FYI: Consulte las páginas de Wikipedia para: el carácter FIN DE TEXTO U + 0003 producido por Control + C, y el carácter FIN DE TRANSMISIÓN U + 0004 producido por Control + D.
Basil Bourque

Respuestas:

61

CtrlCle dice a la terminal que envíe un SIGINTproceso al primer plano actual, que por defecto se traduce en la finalización de la aplicación. CtrlDle dice al terminal que debe registrar un EOF en la entrada estándar, que bash interpreta como un deseo de salir.

Ignacio Vazquez-Abrams
fuente
63

Ctrl+ D( ^D) significa el final del archivo . Solo funciona al comienzo de una línea (estoy simplificando un poco), y no tiene ningún efecto si el programa no está leyendo la entrada del terminal. En su experimento, ^Dle dijo al shell que no iba a escribir más comandos, por lo que salió; entonces la terminal salió porque su subprograma había terminado.

Ctrl+ C( ^C) significa "interrumpir", es decir, detener lo que estás haciendo. Técnicamente, al presionar se ^Cenvía la señal INT , que de forma predeterminada finaliza una aplicación, pero que en muchos programas significa volver al nivel superior (por ejemplo, en un shell, dejar de escribir una línea de comando y volver a un mensaje prístino).

Si un programa no responde ^C, puede intentar Ctrl+ \( ^\). Esto envía la señal QUIT , que por defecto termina una aplicación, y que no interceptan tantos programas.

Otra tecla que envía una señal es Ctrl+ Z( ^Z). Envía la señal TSTP , que detiene el programa que se ejecuta en primer plano. (TSTP es la abreviatura de "parada terminal"; es similar a STOP pero TSTP puede ignorarse mientras que STOP no puede). Desde el shell, puede reanudar la ejecución de ese programa con el fgcomando (reanudar en primer plano) o el bgcomando (reanudar en el antecedentes).

Todas estas teclas se pueden cambiar con el sttycomando. Algunos programas, particularmente los programas de pantalla completa que tienen combinaciones de teclas, los deshabilitan.

Gilles 'SO- deja de ser malvado'
fuente
Una pequeña corrección: Control-Z envía la señal TSTP (parada de terminal). Esto puede ser captado o ignorado por los procesos, mientras que la señal STOP no puede serlo.
Chris Page
Necesitaba esto! estaba atascado y no podía salir
ahnbizcad
1
Solo una sugerencia con respecto a CTRL-D: significa "vaciar la entrada que escribí hasta ahora" y si la línea está vacía, read () regresa con cero, y eso se interpreta como "final del archivo".
luca
Esta es información súper importante y útil; gracias por la explicación completa y clara
iono
Solo por curiosidad, ¿por qué el programa de Python que se ejecuta en shell no se cierra con ctrl + c, sino que aparece KeyboardInterrupt? Se cierra con ctrl + d (si está al principio de una línea) y con ctrl + \.
Rick
2

Agregando a las 2 respuestas realmente buenas anteriores, aquí hay un ejemplo:

Si escribe pythonen el shell, lo lleva al indicador >>> de python.

Ahora, si golpeas Ctrl+C, dirá KeyboardInterrupty permanecerá en el >>>.
Si se entra en un bucle, por ejemplo, escribiendo for x in (text):espera para que escriba más allá al mostrar una pronta ..., si se golpea Ctrl+Cahora, que va a salir de la instrucción for y el retorno a la pronta >>>
Si usted golpea Ctrl+Den cualquier momento, ya sea en >>> o ... saldrá del indicador de Python y volverá al shell original.

Del mismo modo, si ssh'ed en otra máquina, a Ctrl+Cterminará cualquier comando existente, Ctrl+Dlo hará y también saldrá de la máquina. (Además, la Deleteclave es lo mismo que hacer un Ctrl+D)

Siddhartha
fuente
Agradezco esta respuesta. Sin embargo, encontré algunas inexactitudes al probarlo por mí mismo. Mientras estaba en una máquina remota y ejecutaba el proceso de Python, Ctrl + D salió de Python y me llevó de vuelta a la indicación de la máquina remota, no salió de la máquina. Además, la tecla Eliminar no funcionó igual que Ctrl + D en cualquier caso, ejecutando python, en el indicador remoto o en mi indicador local. No parecía hacer nada, excepto borrar caracteres mientras escribía en python, por supuesto. Sin embargo, Ctrl + D actuó como la tecla Eliminar al escribir, eliminó caracteres.
Stack Underflow
1
Eso es interesante, creo que podría depender del tipo de shell que esté utilizando (bash, ksh, etc.).
Siddhartha