%3F.png)
Digamos que o ping
comando esteja em execução e eu digite algo no terminal enquanto ping
ainda está em execução.
Agora quando ping
terminar e bash
recuperar o controle, bash
imprimirei no terminal o que digitei enquanto ping
estava rodando. Esta é uma captura de tela que mostra o que quero dizer:
Como bash
conseguiu 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 stdin
está 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 wait
estado 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.