Niektóre narzędzia interfejsu wiersza poleceń zwracają uszkodzoną konsolę po anulowaniu przez CTRL+C
. Czasami tekst jest niewidoczny lub występują problemy graficzne, dopóki nie uruchomię polecenia reset
.
(Używam bash, ale spodziewam się, że jest niezależny od powłoki.)
Czy ten efekt ma nazwę? Co to powoduje i jak programiści mogą temu zapobiec w narzędziach? Czy istnieje strategia rozwiązania tego problemu w głównych językach programowania?
command-line
console
kill
crash
Jonas Stein
źródło
źródło
stty sane
za szare brodyOdpowiedzi:
Konsola czasami potrzebuje
reset(1)
(lub jakiegośstty(1)
polecenia), ponieważ stan pseudo-terminala nie zmienia się, gdy jakiś proces (np. Program uruchomiony przez twoją powłokę) zakończy się.Przeczytaj tty odszyfrowany .
(Uważam, że obsługa pseudo-terminali i pseudotty jest najtrudniejszą częścią Linuksa)
Dobrze wychowany program zajmujący się terminalem i zmieniający jego tryb lub dyscyplinę liniową powinien starać się unikać awarii i wydawać odpowiednie wywołania (patrz termios (3) ), aby ustawić terminal we właściwym stanie. BTW, biblioteki takie jak ncurses lub readline są pomocne (ale musisz odpowiednio wywoływać ich procedury czyszczenia).
Patrz sygnał (7) i bezpieczeństwo sygnału (7) . Unikanie awarii kodu jest trudne. Przeczytaj o niezdefiniowanym zachowaniu .
Niedoskonałym obejściem może być zdefiniowanie funkcji powłoki, która uruchamia program, a następnie wykonuje
reset
(co może być czasem nieodpowiednie).źródło
reset
może powodować innestty
ustawienia niż oryginalne.stty -a > /tmp/test1
bash, a następnie polecenie, które anulowałem. Kolor terminala był teraz czerwony.stty -a > /tmp/test2
aletest1
itest2
były dokładnie takie same.Reakcja na ten problem nie jest całkowicie niezależna od powłoki. W Zsh jest
ttyctl
wbudowany, który może „zamrozić” lub „odmrozić” tryb tty. Nie sądzę, że jest odpowiednik w bash.setty
Komenda w tcsh robi to samo, ale bardziej drobnoziarnisty: można zamrażać poszczególne ustawienia.Zamrożenie trybu tty oznacza po prostu, że zsh zapamięta bieżący tryb, a jeśli jakieś przyszłe dziecko go zmieni, tryb zostanie przywrócony, gdy dziecko zawiesi się lub zakończy.
To ochroni cię przed niektórymi złymi skutkami programów, które zawieszają się lub w inny sposób nie czyszczą terminala. Musisz pamiętać o odblokowaniu, jeśli chcesz dokonać zmiany
stty
, w przeciwnym razie powłoka natychmiast cofnie to, costty
zrobiłeś.reset
robi więcej niż tylkostty
tryby przywracania , więc czasem możesz go potrzebować, ale nie często.źródło