Quizás esto haya sido respondido previamente, agradecería un enlace a otra respuesta ...
Si ejecuto un comando de shell (en un bash
shell) como el siguiente:
make
Luego, mientras la salida de make
se desplaza desde STDOUT
del make
comando, si escribo make check
y presiono enterantes de que el primer comando termine de ejecutarse, cuando el make
comando finalmente termine, el siguiente comando make check
se levantará y se ejecutará.
Mis preguntas son simplemente:
- ¿Es peligroso hacer esto?
- ¿Hay posibles comportamientos inesperados de este tipo de escritura rápida?
- ¿Por qué funciona esto como lo hace?
Respuestas:
Funciona de la manera que lo hace porque Unix es full-duplex. Como dijo Ritchie en El sistema de tiempo compartido UNIX: una retrospectiva :
[fin de la cita]
Dicho esto, hay algunos programas modernos que comen o descartan cualquier tipo de letra;
ssh
yapt-get
son dos ejemplos. Si escribe con anticipación mientras se están ejecutando, es posible que la primera parte de su entrada haya desaparecido. Eso podría ser un problema.fuente
bash
fork()
sysexec
el comando, ¿el primer comando todavía está conectado alSTDIN
del bash shell? Parece que la respuesta es no, bash parece estar amortiguando el siguiente comando. ¿Es eso correcto?&
.STDIN
maneja de una manera quinta? Y supongo que a menos que el proceso hijo de bash cierre explícitamente su identificador de archivo heredadoSTDIN
, ¿ aún podría leer desde una escritura adicional?El comportamiento básico que estás viendo es que la entrada se encuentra en un búfer en algún lugar hasta que se lee (bueno, si escribes lo suficiente, eventualmente los búferes se llenarán y se perderá algo, eso sería mucho escribir). La mayoría de las cosas ejecutadas por make no leen desde STDIN, por lo que permanece en el búfer.
El peligro es que el comando incorrecto lee su entrada. Por ejemplo,
make
llama a algo que decide avisarte, y luego podría leer tu próximo comando como respuesta. Cuán peligroso es eso depende del comando, por supuesto. (También pueden eliminar todas las entradas primero, simplemente descartando su entrada anterior).Un comando, comúnmente utilizado en Makefiles, que puede hacer eso es TeX. Si encuentra un error (y no se le ha dado una marca para que nunca le pregunte al usuario), le preguntará cómo desea continuar.
Una mejor opción es, probablemente, a plazo:
make && make check
.fuente
make
, en su ejemplo) que se haya completado con éxito. Por ejemplo,make foo
Enter>./foo
Enter podría causar un problema. Es posible que desee intentar acostumbrarse a escribir cosas comomake && make check
, donde el segundo comando se ejecutará solo si el primero tiene éxito.make check
, terminarías ejecutando el comandoheck
, que probablemente no existe en su sistema (pero podría ser algo desagradable). Si el primer comando es algo benigno que usted conoce y confía, no veo ningún problema de inmediato.fuente
ls
ymount
por ejemplo. Estoy tratando de entender cómo se maneja la entrada almacenada en el búfer. Gracias por la respuesta.