Adicionar &
gera um processo em segundo plano.
Se você escrever a; b
, ele executará o comando a
, aguardará o término e, em seguida, executará o comando b
.
Se você escrever a & b
, ele gerará a
como um processo em segundo plano. Ele não irá esperar pela sua conclusão e começará a executar b
imediatamente. Ele irá rodar ambos de uma vez.
Você pode ver o que faz experimentando no shell. Se você tem X
instalado, xterm
é uma boa maneira de ver o que acontece: digitando
$ xterm
fará com que outra janela de terminal seja aberta, e a primeira esperará até você fechar a janela. Somente quando você fechar você pegará sua concha de volta. Se você digitar
$ xterm &
então ele será executado em segundo plano, e você recuperará seu shell imediatamente, enquanto a janela xterm
também permanecerá aberta.
Então, se você escreve
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
faz a conexão, envia a string, armazena o que sai no arquivo e somente então passa para o próximo.
Adicionar o &
faz com que não espere. Ele acabará executando todos os dez mil deles mais ou menos simultaneamente.
Seu script parece "terminar" mais rapidamente, porque provavelmente ele não terminou naquele tempo. Acabou de fazer dez mil empregos em segundo plano e depois terminou o primeiro plano.
Isso também significa que, no seu caso, ele tentará abrir dez mil conexões mais ou menos ao mesmo tempo. Dependendo do que a outra extremidade pode manipular, alguns deles podem falhar. Não só isso, mas não há garantia de que eles serão executados em ordem, na verdade eles quase certamente não, então o que realmente vai acabar em /tmp/me/dump.txt
é palpite de ninguém.
Você verificou se a saída estava correta?