Como o bash recupera o que foi escrito no terminal (sem pressionar Enter)?

Como o bash recupera o que foi escrito no terminal (sem pressionar Enter)?

Digamos que o pingcomando esteja em execução e eu digite algo no terminal enquanto pingainda está em execução.

Agora quando pingterminar e bashrecuperar o controle, bashimprimirei no terminal o que digitei enquanto pingestava rodando. Esta é uma captura de tela que mostra o que quero dizer:

insira a descrição da imagem aqui

Como bashconseguiu essa informação? Tenho certeza que não foi obtido de stdin, porque quando digitei "I typed this while ping was running", não pressionei Enter(e por isso stdinestá vazio).

Responder1

Bashfezobtenha sua entrada de sua entrada padrão (stdin), que é o terminal.

Um terminal pode estar em um dos doismodos:cruoucozinhou(também conhecido como “modo personagem” e “modo linha”, os termos “cru” e “cozido” são usados ​​principalmente no mundo Unix) (a palavra “cozido” foi introduzida como um trocadilho para fazer o oposto de “cru” ). No modo bruto, o terminal transmite a entrada imediatamente para o aplicativo. No modo cozido, o terminal lê uma linha completa e fornece um mecanismo (muito primitivo) de edição de linha, e só transmite os dados para a aplicação quando o usuário pressiona Enter.

Os terminais iniciam no modo cozido. Aplicativos que desejam mais controle sobre a entrada, como o bash, configuram o terminal no modo bruto enquanto aguardam o usuário digitar um comando.

Responder2

Acredito que o terminal armazena em buffer cada linha de texto recebida através do teclado, de modo que qualquer programa que tenha um descritor de arquivo (ou seja, fd0) anexado ao arquivo do dispositivo do terminal - não verá nenhum texto da linha até que o terminal o "envie" - o que acontece quando você pressiona Enter.
(Como os editores de linha dos shells contornam isso - não tenho certeza, mas eles definitivamente acessam o texto antes de você clicar Enter)

Além disso, quando um shell inicia um processo filho (neste caso ping), ele entra em um waitestado suspenso enquanto o processo filho é executado, portanto, mesmo que o terminal não estivesse retendo texto dele, o shell o ignoraria, assumindo que foi destinado ao processo filho.

Então o texto que você vê aparecendo na tela é porque oterminalestá exibindo-o, mas não há nenhum programa capturando-o e fazendo nada com ele, até que o filho saia - e o shell "acorde" - então o texto é enviado para o editor de linha do shell. Embora eu não ache que todos os terminais necessariamente faça isso.

informação relacionada