Ao executar um shell ou a maioria dos programas em um shell, qualquer coisa que você digitar será retornada ao terminal do usuário pelo subsistema tty do kernel. Há outro tratamento especial, também, para apagar caracteres, Ctrl + R, Ctrl + Z e assim por diante.
Certos programas (em particular do editor) executados a partir de uma linha de comando não precisam ou querem isso. Por essa razão, eles sinalizam ao kernel com uma chamada IOCTL contra o dispositivo tty (terminal) que eles não querem esse comportamento. Eles também não querem que personagens especiais façam coisas especiais. Em vez disso, eles pedem ao kernel por um modo "bruto". Em particular, editor's como vim desligam várias "configurações de eco". Tudo isso se aplica a terminais reais em linhas seriais de um computador, ou aos terminais virtuais em Alt + Ctrl + F1, ou aos terminais realmente virtuais que você obtém quando executa algo como o gnome-terminal sob uma GUI.
Tais programas devem reconfigurar quaisquer modos que eles mudem no virtual tty que estão usando antes de sair, seja digitando um comando quit editor ou tomando um sinal (de Control + C), por exemplo.
Se eles não conseguirem fazer isso corretamente, o tty é deixado no estado engraçado que você descobriu. Como os programas podem falhar ao redefinir o terminal, o comando reset
foi gravado para permitir que o usuário se recupere.
Eu assumo que a interrupção está mexendo com o software python que você está executando. Eu acho que esse programa não está tendo a chance de redefinir o terminal, ou simplesmente está falhando em fazê-lo.
No caso do vim, quando executo o seu exemplo, recebo o mesmo comportamento que você descreve. Eu também vejo uma mensagem "Vim: Aviso: a entrada não é de um terminal" (ele vai embora quando você redefinir). Isso ocorre porque o vim não é iniciado normalmente a partir do shell. Em vez disso, os comandos 'grep' e 'xargs' usavam a entrada padrão, normalmente ocupada pelo tty, para propósitos de passar os nomes dos arquivos de grep
para xargs
.
Na sua saída publicada de stty -a
, podemos ver "-echo", confirmando também que esse é o problema. Se você fosse matar o vim de tal maneira que ele não pudesse lidar com o sinal graciosamente, você provavelmente veria o mesmo problema.
O problema é descrito em outro lugar em link .
Uma solução para o caso vim é evitar xargs e usar em seu lugar:
vim $(grep foo * -l)
Aqui a lista de arquivos é construída pelo shell, como tinha sido por xargs, mas o shell está chamando o vim, que está diretamente conectado ao tty. Há uma mensagem de aviso enviada ao arquivo de saída de erro e o vim define e redefine as configurações do tty corretamente.
Mais referências aqui e outra interessante here . Outra solução interessante é dada em uma resposta a link .