O comando não trava. Você acha que o comando está travando porque você não vê o prompt. O prompt está lá. Você não vê o prompt porque ele foi enviado pela saída do processo em segundo plano. Pressionar enter após a saída longa de um processo em segundo plano faz com que o shell "execute" a linha vazia e imprima um novo prompt.
Tente o seguinte para se convencer:
- execute
find . &
- espere até que a saída seja feita
- ver o cursor piscando ou algo assim, mas nenhum prompt
- digite
echo foo
- pressione Enter
- veja
foo
impresso e um novo prompt
Mais experiências:
seq 10 &
isto imprimirá os números de 1 a 10 e depois imprimirá uma solicitação.
seq 10000 &
isto imprimirá os números de 1 a 10000 e então você terá o cursor piscando e nenhum prompt. Mas o prompt está lá. tente echo foo
e pressione enter e você verá foo
impresso e um novo prompt.
(sleep 2; seq 10) &
este comando emula o tempo de espera de um comando com saída longa, mas não possui uma saída longa. No meu sistema, isso tem o seguinte efeito: primeiro sleep 2
é executado em segundo plano. momentos depois, o shell imprime o prompt. depois de 2 segundos, seq 10
é executado em segundo plano. isto irá imprimir dez linhas e empurrar o prompt para cima. então o trabalho em segundo plano está pronto.
Então você vê que o trabalho em segundo plano sempre termina e você sempre tem um prompt, você nem sempre vê o prompt. Quando o trabalho em segundo plano é concluído rapidamente, o shell imprime o prompt no final e você vê o prompt. Quando o trabalho em segundo plano demora um pouco para imprimir, o shell já imprimiu um prompt, mas esse prompt é enviado para que você não o veja mais.
Ainda mais experimentos:
Teste seq 10000 &
ou qualquer outro número grande em que não seja exibido um prompt no final da saída. Agora tente metade desse número. Neste exemplo seq 5000 &
. Você vê um aviso? Se você fizer isso, tente um número maior. Por exemplo, seq 7500 &
. Se você não vir um prompt, tente um número menor. Por exemplo, seq 2500 &
. Continue fazendo isso até que você tenha o número onde você vê o prompt empurrado apenas algumas linhas para cima. O número varia de corrida para corrida porque o que temos aqui é praticamente uma condição de corrida entre o processo em segundo plano e o processo shell .