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?

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.


¡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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.