O primeiro
for i in {1..3}; do
./script.sh >& log.$i &
done
é executado no shell atual. Cada iteração do loop executa o script script.sh
como um trabalho do shell atual e, portanto, você pode vê-lo.
O segundo
for i in {1..3}; do
./script.sh >& log.$i &
done &
primeiro inicia um subshell que controla o loop. Em seguida, as 3 iterações criam 3 subprocessos no shell this , enquanto no seu shell atual você só pode ver 1 job, que é o comando inteiro, ainda não dividido em tarefas específicas. (Você deve ver este trabalho 1. Seja como um executando ou como concluído .)
O executável ./tmp
deve ser executado da mesma maneira em ambos os casos. Se você ver echo "hello"
foi executado, isso significa que ./tmp
foi concluída antes. Se ele se comportar de forma anormal, você deve depurar (e adicionar os detalhes à sua pergunta). Especialmente, verifique se as condições iniciais são as mesmas no momento da chamada em ambos os casos. Por exemplo. se houver verificações de arquivos existentes, verifique se, em ambos os casos, eles existem / não existem, etc.