Cómo señalar el final de la entrada estándar

82
  1. En Bash, aprendí que la señal de finalización se puede cambiar en este documento. Pero por defecto, ¿cómo puedo señalar el final de la entrada estándar?
  2. Me di cuenta de que con cat y chardet, sus entradas stdin se pueden señalar como finalizadas por Ctrl + d. Pero parece recordar que Ctrl + d y Ctrl + c son similares a finalizar la ejecución de un comando en ejecución. ¿Entonces estoy equivocado?
Tim
fuente

Respuestas:

114

Ctrl+D, cuando se escribe al comienzo de una línea en un terminal, significa el final de la entrada. Esto no es una señal en el sentido de Unix: cuando una aplicación está leyendo desde el terminal y el usuario presiona Ctrl+D, se notifica a la aplicación que se ha alcanzado el final del archivo (como si estuviera leyendo un archivo y hubiera pasado el último byte).

Ctrl+Cenvía una señal, SIGINT . Por defecto, SIGINT (la señal de interrupción) mata la aplicación en primer plano, pero la aplicación puede captar la señal y reaccionar de alguna manera diferente (por ejemplo, el propio shell capta la señal y aborta la línea que ha comenzado a escribir, pero no t salir, muestra un nuevo aviso y espera una nueva línea de comando).

Puede cambiar los caracteres asociados con el fin de archivo y SIGINT con el sttycomando, por ejemplo stty eof a, haría ael carácter de fin de archivo y stty intr ^-deshabilitaría el carácter SIGINT. Esto rara vez es útil.

Gilles
fuente
¡Gracias! ¿ Ctrl+DSignifica Ctrl y D mayúscula o no importa?
Tim
55
@Tim: es minúscula lo que quiere ... la convención de escribir comandos de teclado con mayúsculas se debe a que las etiquetas en el teclado siempre están en mayúsculas y lo que se describe es una SECUENCIA DE CLAVE, no el código de caracteres real que ve el programa. Sí, esto es confuso a veces.
Caleb
@Caleb: ¡Gracias! ¿Cómo se debe especificar que la clave está en mayúscula? ¿O alguna vez hay tal caso?
Tim
@Tim En un terminal, las combinaciones de teclas Ctrl+Shift+Dy Ctrl+Denvían el mismo carácter de todos modos (número de carácter 4, generalmente llamado Ctrl+D).
Gilles
2
@Tim El terminal recibió Ctrl + D. No envía un personaje al programa. Lo que sucede es que cuando el programa lee desde el terminal, el terminal le dice "este es el final del archivo", igual que cuando un programa intenta leer después del final de un archivo de disco. El caparazón no está involucrado en absoluto.
Gilles
23

Su segundo punto agrupa dos cosas completamente diferentes.

  • Ctrl + C envía una señal de cierre al proceso en ejecución.
  • Ctrl + D envía un carácter de Fin de transmisión .

Estás buscando lo último.

Caleb
fuente
77
Posibilidad de confusión aquí: desde la perspectiva de la aplicación, no se envía ningún carácter real para ^ D. Lo que significa que la aplicación no read(2)recibe ese personaje de la llamada al sistema.
ulidtko