Algumas ferramentas da interface da linha de comandos retornam um console quebrado quando canceladas por CTRL+C
. Às vezes, o texto é invisível ou há problemas gráficos até que eu execute o comando reset
.
(Eu uso o bash, mas espero que seja independente do shell.)
Esse efeito tem um nome? O que causa isso e como os programadores podem impedir isso nas ferramentas? Existe uma estratégia de como esse problema é tratado nas principais linguagens de programação?
command-line
console
kill
crash
Jonas Stein
fonte
fonte
stty sane
para as barbas cinzentasRespostas:
Às vezes, um console precisa de um
reset(1)
(ou de algumstty(1)
comando) porque o estado de um pseudo-terminal não muda quando algum processo (por exemplo, um programa iniciado pelo seu shell) termina.Leia o tty desmistificado .
(Acho que a manipulação de pseudo-terminais e pseudottys é a parte mais difícil do Linux)
Um programa bem-comportado que lide com o terminal e altere seu modo ou disciplina de linha deve tentar evitar batidas e emitir as chamadas apropriadas (consulte os termos (3) ) para colocar o terminal no estado correto. BTW, bibliotecas como ncurses ou readline são úteis (mas você precisa chamar suas rotinas de limpeza adequadamente).
Veja o sinal (7) e sinal de segurança (7) . É difícil evitar falhas no seu código. Leia sobre comportamento indefinido .
Uma solução alternativa imperfeita poderia ser definir uma função shell que executa o programa e executa um
reset
(que às vezes pode ser inapropriado).fonte
reset
pode resultar emstty
configurações diferentes das originais.stty -a > /tmp/test1
no bash e depois um comando, que cancelei. A cor do terminal estava agora vermelha.stty -a > /tmp/test2
mastest1
etest2
eram exatamente iguais.Responder a esse problema não é completamente independente do shell. No zsh, existe o
ttyctl
built-in, que pode "congelar" ou "descongelar" o modo tty. Eu não acho que exista um equivalente no bash. Osetty
comando no tcsh faz a mesma coisa, mas com mais detalhes: você pode congelar configurações individuais.Congelar o modo tty significa apenas que o zsh lembrará o modo atual e, se algum filho futuro o alterar, o modo será restaurado quando o filho suspender ou terminar.
Isso o protegerá de alguns dos efeitos negativos dos programas que travam ou que não conseguem limpar o terminal. Você deve se lembrar de descongelar se quiser fazer uma alteração
stty
, caso contrário o shell desfará imediatamente o que vocêstty
fez.reset
faz mais do que restaurarstty
modos, então você ainda pode precisar algumas vezes, mas não com frequência.fonte