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

5

Digamos que o comando ping esteja em execução e digite algo no terminal enquanto ping ainda estiver em execução.

Agora, quando ping terminar e bash ganharem o controle de retorno, bash imprimirá no terminal o que eu digitei enquanto ping estava sendo executado. Esta é uma captura de tela que mostra o que quero dizer:

Comobashobteveessainformação?Tenhocertezadequeelenãoobtevedestdin,porquequandoeudigitei"I typed this while ping was running" , eu não pressionei Enter (e assim stdin está vazio).

    
por paul 21.05.2017 / 06:31

2 respostas

4

Bash fez obter sua entrada de sua entrada padrão (stdin), que é o terminal.

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

Os terminais começam no modo cozido. Aplicativos que querem mais controle sobre a entrada, como o bash, configuram o terminal no modo raw enquanto aguardam o usuário digitar um comando.

    
por 22.05.2017 / 01:25
0

Acredito que o terminal armazena em buffer cada linha de texto recebida pelo teclado, de modo que qualquer programa que tenha um descritor de arquivo (ou seja, fd0) anexado ao arquivo de dispositivo dos terminais - não verá nenhum texto da linha até o terminal " envia "it - o que acontece quando você pressiona Enter . <(como os editores de linha dos shells se esquivam disso - eu não tenho certeza, mas eles definitivamente pegam o texto antes de você pressione Enter )

Além disso, quando um shell inicia um processo filho (neste caso ping ) ele entra em um estado suspenso / wait ing conforme o processo filho é executado, portanto, mesmo que o terminal não tenha retido texto dele, o shell iria ignorá-lo, assumindo que era destinado ao processo filho.

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

    
por 21.05.2017 / 08:39