Einige Befehlszeilenschnittstellentools geben eine defekte Konsole zurück, wenn sie von abgebrochen werden CTRL+C
. Manchmal ist der Text unsichtbar oder es gibt Grafikprobleme, bis ich den Befehl ausführe reset
.
(Ich benutze Bash, erwarte aber, dass es unabhängig von der Shell ist.)
Hat dieser Effekt einen Namen? Was verursacht dies und wie können Programmierer dies in den Tools verhindern? Gibt es eine Strategie, wie dieses Problem in den wichtigsten Programmiersprachen angegangen wird?
command-line
console
kill
crash
Jonas Stein
quelle
quelle
stty sane
für die grauen BärteAntworten:
Eine Konsole benötigt manchmal einen
reset(1)
(oder einenstty(1)
Befehl), da sich der Status eines Pseudo-Terminals nicht ändert, wenn ein Prozess (z. B. ein von Ihrer Shell gestartetes Programm) beendet wird.Lesen Sie die tty entmystifiziert .
(Ich finde den Umgang mit Pseudo-Terminals und Pseudottys der schwierigste Teil von Linux)
Ein gut erzogenes Programm, das sich mit dem Terminal befasst und dessen Modus oder Leitungsdisziplin ändert, sollte sich bemühen, Abstürze zu vermeiden, und die entsprechenden Aufrufe (siehe Termios (3) ) ausgeben , um das Terminal in den richtigen Zustand zu versetzen. Übrigens sind Bibliotheken wie ncurses oder readline hilfreich (aber Sie müssen ihre Bereinigungsroutinen entsprechend aufrufen).
Siehe Signal (7) und Signalsicherheit (7) . Es ist schwierig, Abstürze in Ihrem Code zu vermeiden. Lesen Sie mehr über undefiniertes Verhalten .
Eine unvollständige Problemumgehung könnte darin bestehen, eine Shell-Funktion zu definieren, die Ihr Programm ausführt und dann eine ausführt
reset
(was manchmal unangemessen sein kann).quelle
reset
kann dies zu anderenstty
Einstellungen als den ursprünglichen führen.stty -a > /tmp/test1
in bash dann einen Befehl, den ich abbrach. Die Terminalfarbe war jetzt rot.stty -a > /tmp/test2
abertest1
undtest2
waren genau das gleiche.Die Reaktion auf dieses Problem ist nicht vollständig Shell-unabhängig. In zsh gibt es das
ttyctl
eingebaute, das den tty-Modus "einfrieren" oder "auftauen" kann. Ich glaube nicht, dass es ein Äquivalent in Bash gibt. Dersetty
Befehl in tcsh macht dasselbe, aber feinkörniger: Sie können einzelne Einstellungen einfrieren.Das Einfrieren des tty-Modus bedeutet nur, dass sich zsh an den aktuellen Modus erinnert. Wenn ein zukünftiges Kind ihn ändert, wird der Modus wiederhergestellt, wenn das Kind angehalten oder beendet wird.
Dies schützt Sie vor einigen der negativen Auswirkungen von Programmen, die abstürzen oder das Terminal auf andere Weise nicht bereinigen können. Sie müssen daran denken, das Einfrieren aufzuheben, wenn Sie eine Änderung vornehmen möchten
stty
, da sonst die Shell sofort rückgängig macht, wasstty
auch immer Sie getan haben.reset
bietet mehr als nur Wiederherstellungsmodistty
, sodass Sie es möglicherweise manchmal, aber nicht oft benötigen.quelle