Certains outils d'interface de ligne de commande renvoient une console cassée lorsqu'ils sont annulés par CTRL+C
. Parfois, le texte est invisible ou il y a des problèmes graphiques jusqu'à ce que j'exécute la commande reset
.
(J'utilise bash, mais attendez-vous à ce qu'il soit indépendant du shell.)
Cet effet a-t-il un nom? Qu'est-ce qui cause cela et comment les programmeurs peuvent-ils empêcher cela dans les outils? Existe-t-il une stratégie pour résoudre ce problème dans les principaux langages de programmation?
command-line
console
kill
crash
Jonas Stein
la source
la source
stty sane
pour les barbes grisesRéponses:
Une console a parfois besoin d'une
reset(1)
(ou d'unestty(1)
commande) car l'état d'un pseudo-terminal ne change pas quand un processus (par exemple un programme démarré par votre shell) se termine.Lisez le tty démystifié .
(Je trouve que la gestion des pseudo-terminaux et pseudottys est la partie la plus difficile de Linux)
Un programme bien comporté traitant du terminal et changeant son mode ou discipline de ligne devrait s'efforcer d'éviter de planter et d'émettre les appels appropriés (voir termios (3) ) pour mettre le terminal dans le bon état. BTW, les bibliothèques comme ncurses ou readline sont utiles (mais vous devez appeler leurs routines de nettoyage de manière appropriée).
Voir signal (7) et sécurité du signal (7) . Éviter de planter dans votre code est difficile. Lisez à propos de comportement indéfini .
Une solution de contournement imparfaite pourrait être de définir une fonction shell qui exécute votre programme puis fait un
reset
(ce qui pourrait parfois être inapproprié).la source
reset
peut parfois entraîner desstty
paramètres différents de ceux d'origine.stty -a > /tmp/test1
en bash puis une commande, que j'ai annulée. La couleur terminale était maintenant rouge.stty -a > /tmp/test2
maistest1
ettest2
étaient exactement les mêmes.Répondre à ce problème n'est pas complètement indépendant du shell. Dans zsh, il y a le
ttyctl
builtin, qui peut "geler" ou "dégeler" le mode tty. Je ne pense pas qu'il y ait un équivalent en bash. Lasetty
commande dans tcsh fait la même chose, mais de façon plus fine: vous pouvez figer les paramètres individuels.Geler le mode tty signifie simplement que zsh se souviendra du mode actuel, et si un futur enfant le change, le mode sera restauré lorsque l'enfant suspendra ou se terminera.
Cela vous protégera de certains des effets néfastes des programmes qui plantent ou échouent à nettoyer le terminal. Vous devez vous rappeler de dégeler si vous voulez faire un changement avec
stty
, sinon le shell annulera immédiatement tout ce que vous avezstty
fait.reset
fait plus que desstty
modes de restauration , vous pouvez donc en avoir besoin parfois, mais pas souvent.la source