O que permite que um comando seja digitado enquanto o comando anterior ainda está sendo executado em primeiro plano?

2

Às vezes tenho visto quando um programa (digamos A ) está sendo executado em primeiro plano e imprimindo sua saída para stdout, eu posso digitar outro comando (digamos B ) e quando pressiono Enter ele é executado, mesmo que eu não tenha sido solicitado a digitar B , pois A ainda não havia concluído a execução. Eu poderia fazer isso no shell tcsh e o resultado final foi que B foi executado após A .

Como esse recurso é chamado? Esta concha é específica? Como funciona sem eu digitar o comando no prompt?

    
por Geek 27.05.2015 / 11:01

2 respostas

5

Isso é chamado de typeahead e não é específico do shell. O que você digita acaba sendo armazenado em buffer no terminal, e da próxima vez que um programa em execução no terminal estiver pronto para a entrada, ele lerá o que está aguardando no buffer. No seu exemplo, esse programa é o shell, portanto, ele executa o comando digitado como se você tivesse esperado que A terminasse antes de digitá-lo.

Alguns programas limpam explicitamente o buffer antes de aceitar entrada; por exemplo, a maioria dos programas que solicitam uma senha limpa o buffer, para garantir que o usuário saiba o que foi digitado (desde que a entrada não seja ecoada).

    
por 27.05.2015 / 11:08
2

Parece que o que você está descrevendo é realmente o programa A sendo executado em segundo plano. Um processo ainda pode imprimir no terminal, mesmo se estiver sendo executado em segundo plano.

Um exemplo básico:

#----background_program----#
#!/bin/bash

for ((i=0;i<=10;i++)); do
    echo "$i"
    sleep 5
done

exit 0

Você pode rodar isso em segundo plano, ver a saída aparecendo no seu terminal. Após a primeira mensagem de saída, o cursor é movido para fora do prompt. Você pode então executar outros comandos em primeiro plano enquanto background_program ainda está em execução:

./background_program &     # '&' to put in background
echo "wut"
echo "foo"
echo "bar"

Isso lhe dará algo como:

sandbox@Dionysus:~$ ./background_program &
[1] 6197
sandbox@Dionysus:~$ 0
echo "wut"
wut
sandbox@Dionysus:~$ 1
echo "foo"
foo
sandbox@Dionysus:~$ 2
echo "bar"
bar
sandbox@Dionysus:~$ 3
4
5
6
7
8
9
10

Eu fiz isso em um terminal gnome, mas não acho que o comportamento seja incomum.

Se você tivesse que executar seu programa A em primeiro plano, você obtém exatamente o que @Stephen disse, digamos. O programa não é executado como seu comando é carregado no buffer e, em seguida, interpretado após a conclusão do programa.

    
por 27.05.2015 / 11:18