O Bash executará o último ou único comando de um subshell com exec se pode fazê-lo com segurança, como uma otimização. Você pode validar isso claramente com pstree :
$ pstree $$
bash---pstree
$ ( pstree $$ )
bash---pstree
$ ( pstree $$ ; echo)
bash---bash---pstree
$
É por isso que o ( sleep 5 ) é exibido apenas como o comando sleep e nenhum shell intermediário. No último exemplo acima, o echo força o shell a fazer algo depois que pstree for concluído, portanto, há um shell real por perto para usar; no caso do meio, o shell gerado apenas imediatamente exec s pstree , por isso parece o mesmo que o primeiro caso (que é padrão fork-exec ). Muitas conchas fazem isso.
Por outro lado, qualquer coisa executado em segundo plano requer a geração de um novo processo : fundamentalmente, é isso que "background" é. Comandos em chaves do executam ordinariamente no shell atual, mas isso não pode acontecer se eles forem executados em segundo plano. Para que o shell pai possa continuar fazendo o que está fazendo enquanto os comandos background são executados, um novo shell deve ser criado para executar todo o { ... } in. Assim
$ { pstree $$ ; }
bash---pstree
$ { pstree $$ ; } &
bash---bash---pstree
Neste caso, não há diferença se há outro comando à direita ou não. Bash documenta esse comportamento para & :
If a command is terminated by the control operator ‘
&’, the shell executes the command asynchronously in a subshell. This is known as executing the command in the background. The shell does not wait for the command to finish, and the return status is 0 (true).
Você também pode ver isso acontecer colocando em segundo plano um comando interno, como read :
$ read &
$ pstree $$
[1] 32394
[1]+ Stopped read
$ pstree $$
bash-+-bash
'-pstree
Meu shell agora tem dois filhos: um bash executando read e o comando pstree imprimindo essa saída.
É verdade que o shell poderia fazer uma otimização adicional e aplicá-lo ao background { ... } como às subshells com parênteses, mas isso não acontece. É possível que algumas outras shells façam, mas eu não encontrei nenhuma em testes rápidos. É um caso muito raro e formalmente diferente, e há alguns casos esquisitos.