Por que o terminal ecoa as teclas pressionadas quando os comandos estão em execução?

6

Eu estava recentemente executando tail -f em um arquivo de log de um servidor que estava em execução, tentando diagnosticar um bug, quando acidentalmente toquei no teclado e digitei alguns caracteres. Eles se misturaram com a saída do log, sem maneira de saber qual era qual. Eu tive coisas igualmente irritantes acontecendo comigo inúmeras vezes, e tenho certeza que isso aconteceu com muitas outras pessoas aqui.

Então, minha pergunta é: por que o shell (ou terminal, ou o que quer que esteja fazendo) combina de forma ambígua a entrada do teclado com a saída de comando?

Eu não estou pedindo uma solução prática para um problema imediato. Talvez eu possa descobrir alguma forma de executar o shell stty -echo quando um comando é executado e stty echo quando ele é concluído. Mas eu quero saber a lógica por trás do design do terminal como este. Existe algum propósito prático? Ou é algo feito apenas por razões de compatibilidade, ou algo que não foi muito pensado?

    
por Elias Zamaria 18.06.2015 / 20:54

2 respostas

5

As pessoas geralmente querem ver o que estão digitando (a menos que seja uma senha): -)

O terminal aceita entrada a qualquer momento e armazena em buffer até que um aplicativo o leia. Mais do que isso, quando o tty está no modo cozido , o kernel armazena linhas inteiras de cada vez e fornece alguma funcionalidade de edição de linha rudimentar que permite matar toda a linha em buffer (ligação padrão Ctrl) - u e backspace Durante o tempo que a linha está sendo inserida e editada e até que você pressione Enter , as aplicações que leem do terminal não lêem nada.

A funcionalidade tty no kernel não pode e não pode saber se e quando um aplicativo como tail está planejando produzir saída no terminal, então não seria capaz de cancelar ... (?) a edição de linha durante esses períodos e somente durante esses períodos.

De qualquer forma, ser capaz de preparar a próxima linha para o shell enquanto outra coisa ainda está ocupada rodando no terminal e o shell ainda não está pronto para ler que o comando é um recurso , não um bug , então eu não defendo removê-lo. Talvez não seja tão útil para tail (que nunca terminará sozinho), mas pré-digitando o próximo comando durante uma execução longa cp ou make (por exemplo) e até mesmo editando esse comando com Ctrl - h e Ctrl - u , tudo antes de o shell se apoderar dele, é algo comum de se fazer. Timothy Martin escreveu em um comentário :

It is worth mentioning that less +F somefile provides similar functionality to tail -f somefile except that (accidentally) typed keystrokes will not echo to the screen.

Sim, mas less não apenas evita que esses caracteres sejam ecoados, mas também os consome , então eles não estão disponíveis para o próximo aplicativo que deseja lê-los!

Finalmente, há mais um motivo:

Em tempos históricos (antes do tempo!), terminais com eco local eram comuns. Ou seja, o terminal (geralmente no hardware) faria eco dos caracteres que você digitou localmente, ao mesmo tempo em que os enviava pela linha serial. Isso é útil para dar ao usuário um feedback rápido, mesmo que haja muita latência durante a conexão com o sistema UNIX (pense em 300 Modem de baud discando um servidor de terminal com auto-telnet para um sistema UNIX lento em uma rede token ring - ou o que quer que seja).

Se você tiver um terminal com eco local, então você deseja stty -echo o tempo todo no servidor UNIX ao qual está conectado. O resultado é aproximadamente o mesmo que um terminak sem echo local (o tipo comum hoje) e stty echo habilitado. Assim, a partir desse ponto de vista, o trabalho de stty echo é fazer com que os charatecas sejam imediatamente percebidos, independentemente de qual software está sendo executado, emulação do que aconteceria em um terminal com eco local.

(A propósito, se você tem um terminal com eco local, você não pode esconder sua senha.)

    
por 19.06.2015 / 04:54
2

Com zsh , se você quiser desativar o tty device local echo para um comando específico, você pode fazer:

STTY=-echo a-specific-command

zsh aplicará as configurações específicas (chamando stty ) e as restaurará quando o comando terminar.

Claro, você provavelmente só desejará fazer isso para aplicativos que não leiam no dispositivo tty.

    
por 23.06.2015 / 14:46