¿Cómo recupera bash lo que se escribió en la terminal (sin presionar Enter)?

¿Cómo recupera bash lo que se escribió en la terminal (sin presionar Enter)?

Digamos que el pingcomando se está ejecutando y escribo algo en la terminal mientras pingaún se está ejecutando.

Ahora, cuando pingtermine y bashrecupere el control, bashimprimirá en la terminal lo que escribí mientras pingestaba ejecutando. Esta es una captura de pantalla que muestra lo que quiero decir:

ingrese la descripción de la imagen aquí

¿Cómo bashobtuvo esta información? Estoy seguro de que no lo obtuvo de stdin, porque cuando escribí "I typed this while ping was running", no presioné Enter(y por eso stdinestá vacío).

Respuesta1

Intentohizoobtenga su entrada de su entrada estándar (stdin), que es la terminal.

Un terminal puede estar en uno de dosmodos:crudoococido(también conocido como “modo de carácter” y “modo de línea”, los términos “crudo” y “cocido” se usan principalmente en el mundo Unix) (la palabra “cocido” se introdujo como un juego de palabras para hacer lo opuesto a “crudo” ). En modo sin formato, el terminal transmite la entrada inmediatamente a la aplicación. En modo preparado, el terminal lee una línea completa y proporciona un mecanismo de edición de línea (muy primitivo), y solo transmite los datos a la aplicación cuando el usuario presiona Enter.

Los terminales se inician en modo cocinado. Las aplicaciones que desean tener más control sobre la entrada, como bash, configuran el terminal en modo sin formato mientras esperan que el usuario escriba un comando.

Respuesta2

Creo que el terminal almacena en buffer cada línea de texto recibida a través del teclado, de modo que cualquier programa que tenga un descriptor de archivo (es decir, fd0) adjunto al archivo del dispositivo del terminal no verá ningún texto de la línea hasta que el terminal lo "envíe". - lo que sucede cuando presionas Enter.
(Cómo los editores de línea de shells solucionan esto; no estoy seguro, pero definitivamente acceden al texto antes de presionar Enter)

Además, cuando un shell inicia un proceso hijo (en este caso ping), entra en un waitestado suspendido/ing mientras se ejecuta el proceso hijo, por lo que incluso si el terminal no estuviera reteniendo texto, el shell lo ignoraría, asumiendo que así fuera. destinado al proceso hijo.

Entonces, el texto que ves aparecer en la pantalla se debe a que elTerminallo está mostrando, pero no hay ningún programa que lo capture y haga algo con él, hasta que el niño sale, y el shell "se despierta", entonces el texto se envía al editor de líneas del shell. Aunque no creo que todos los terminales necesariamente Haz eso.

información relacionada