¿Por qué es que al usar bash y suspender un ciclo while, el ciclo se detiene después de reanudarse? Breve ejemplo a continuación.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
Estoy familiarizado con las señales, y supongo que este puede ser el comportamiento natural de bash aquí, pero me gustaría entender mejor por qué se comporta de esta manera en particular.
bash
shell
signals
background-process
bkzland
fuente
fuente
$?
al regresar, y entoncestrue
no es asítrue
. probablemente. Yo creo que.Respuestas:
Esto parece un error en varios shells, funciona como se esperaba con ksh93 y zsh .
Antecedentes:
La mayoría de los shells parecen ejecutar el ciclo while dentro del shell principal y
Bourne Shell suspende todo el shell si escribe ^ Z con un shell sin inicio de sesión
bash suspende solo el
sleep
y luego deja el bucle while a favor de imprimir un nuevo indicador de shellel guión hace que este comando no se pueda suspender
Con ksh93 , las cosas funcionan de manera muy diferente:
ksh93 hace lo mismo, mientras que el comando se inicia la primera vez, pero como
sleep
es un buitin en ksh93, ksh93 tiene un controlador que hace que el bucle while se bifurque en el shell principal y luego se suspenda en el momento en que escribe ^ Z.Si en ksh93 escribe más tarde
fg
, el hijo bifurcado que aún ejecuta el bucle continúa.Verá la principal diferencia al comparar los mensajes de control de trabajo de bash y ksh93:
informes de bash :
[1]+ Stopped sleep 1
pero ksh93 informa:
^Z[1] + Stopped while true; do echo .; sleep 1; done
zsh se comporta de manera similar a ksh93
Con ambos shells, tiene un solo proceso (el shell principal) siempre que no escriba ^ Z, y dos procesos de shell después de escribir ^ Z.
fuente
dash
realmente manejando la señal cuando termina el bucle? en el[d]?ash
código fuente hay todas estas macros para INTON e INTOFF dispersas, y típicamente las señales recibidas en estado INTOFF realmente se manejan en (o alrededor) INTON . de todos modos, solo tengo curiosidad porque creo que lo sabes mejor, es una gran respuesta. gracias.sleep 100
puede suspender y reanudar una soladash
, por lo que parece quedash
conoce los problemas de este comando y deshabilita selectivamente el control del trabajo.dash
el rendimiento en otros shells al dejar caer el procesamiento multibyte? y sí,dash
admite el control del trabajo, pero el estándar dice que un shell interactivo debe ignorar TSTP, y ejecutar un ciclo while en el shell actual en un terminal interactivo no es menos un shell interactivo que cualquier otro.Escribí a uno de los coautores de Bash sobre el tema, y aquí está su respuesta:
Entonces, si alguien quiere enviar un parche, use las direcciones de correo electrónico que se encuentran en las páginas del manual.
fuente