echo one && echo two & echo three && echo four
Tenha em mente que isso é analisado como
echo one && echo two &
echo three && echo four
Assumirei que os comandos echo
foram bem-sucedidos (eles só falhariam em casos de borda, como o redirecionamento para um arquivo em um disco cheio). Portanto, esse snippet executa duas tarefas em paralelo: uma imprime as linhas one
e two
e a outra imprime as linhas three
e four
. A intercalação de one
e two
com three
e four
não é garantida e provavelmente varia de sistema para sistema, de shell para shell e de invocação para invocação. Para um exemplo de brinquedo como esse, você pode observar resultados reproduzíveis em um sistema pouco carregado, mas isso não é algo com o qual você possa contar.
echo one && (echo two &) echo three && echo four
Você alterou a análise: aqui apenas o comando echo two
é executado em segundo plano. Isso garante que one
seja exibido primeiro e, como antes, three
sempre estará antes de four
, mas o posicionamento de two
poderia estar em qualquer lugar após one
.
O shell só imprime uma mensagem sobre os processos em segundo plano, se eles forem iniciados a partir do processo principal do shell, e não quando forem iniciados em um subshell. Parênteses criam um subshell, e é por isso que (echo two &)
não faz com que o shell imprima qualquer mensagem. Isso cria um processo em segundo plano, mas não um trabalho trabalho .
echo one && (sleep 2 && echo two &) echo three && echo four
Nesse snippet, o trabalho em segundo plano fica suspenso por 2 segundos antes de exibir two
. Isso torna extremamente provável (mas não realmente garantida) que two
será produzido após three
e four
.