Algunas herramientas de interfaz de línea de comando devuelven una consola rota cuando se cancela CTRL+C
. A veces el texto es invisible o hay problemas gráficos hasta que ejecuto el comando reset
.
(Uso bash, pero espero que sea independiente del shell).
¿Este efecto tiene un nombre? ¿Qué causa esto y cómo pueden los programadores prevenir esto en las herramientas? ¿Existe una estrategia para abordar este problema en los principales lenguajes de programación?
command-line
console
kill
crash
Jonas Stein
fuente
fuente
stty sane
para las barbas grisesRespuestas:
Una consola a veces necesita un
reset(1)
(o algúnstty(1)
comando) porque el estado de un pseudo-terminal no cambia cuando finaliza algún proceso (por ejemplo, un programa iniciado por su shell).Lee el tty desmitificado .
(Encuentro que el manejo de pseudo-terminales y pseudottys es la parte más difícil de Linux)
Un programa de buen comportamiento que trate con el terminal y cambie su modo o disciplina de línea debería esforzarse por evitar fallas y emitir las llamadas apropiadas (ver termios (3) ) para poner el terminal en el estado correcto. Por cierto, las bibliotecas como ncurses o readline son útiles (pero debe llamar a sus rutinas de limpieza adecuadamente).
Ver señal (7) y señal de seguridad (7) . Evitar fallas en tu código es difícil. Lea sobre el comportamiento indefinido .
Una solución imperfecta podría ser definir una función de shell que ejecute su programa y luego haga un
reset
(que a veces puede ser inapropiado).fuente
reset
puede dar lugar astty
configuraciones diferentes de las originales.stty -a > /tmp/test1
en bash y luego un comando, que cancelé. El color del terminal ahora era rojo.stty -a > /tmp/test2
perotest1
ytest2
eran exactamente lo mismo.Responder a este problema no es completamente independiente de la shell. En zsh, está el
ttyctl
incorporado, que puede "congelar" o "descongelar" el modo tty. No creo que haya un equivalente en bash. Elsetty
comando en tcsh hace lo mismo, pero más detallado: puede congelar configuraciones individuales.Congelar el modo tty solo significa que zsh recordará el modo actual, y si algún futuro hijo lo cambia, el modo se restaurará cuando el hijo suspenda o finalice.
Esto lo protegerá de algunos de los efectos negativos de los programas que se bloquean o que de otra manera no limpian el terminal. Debe recordar descongelar si desea realizar un cambio
stty
, de lo contrario, el shell se deshará inmediatamente de lo que hayastty
hecho.reset
hace más que restablecerstty
modos, por lo que aún puede necesitarlo a veces, pero no con frecuencia.fuente