Os sh -c 'command line' são normalmente usados por coisas como system("command line") , ssh host 'command line' , vi ! , cron e, mais geralmente, tudo o que é usado para interpretar uma linha de comando, por isso é bastante importante torná-lo o mais eficiente possível.
O bifurcação é caro, em tempo de CPU, memória, descritores de arquivos alocados ... Ter um processo shell esperando por outro processo antes de sair é apenas um desperdício de recursos. Além disso, torna difícil relatar corretamente o status de saída do processo separado que executaria o comando (por exemplo, quando o processo é eliminado).
Muitas camadas geralmente tentam minimizar o número de garfos como uma otimização. Mesmo shells não otimizados como bash fazem isso nos casos sh -c cmd ou (cmd in subshell) . Ao contrário do ksh ou zsh, ele não faz isso em bash -c 'cmd > redir' ou bash -c 'cmd1; cmd2' (mesmo em subshells). ksh93 é o processo que vai mais longe em evitar garfos.
Existem casos em que essa otimização não pode ser feita, como quando se faz:
sh < file
Onde sh não pode ignorar a bifurcação para o último comando, porque mais texto pode ser anexado ao script enquanto esse comando estiver em execução. E para arquivos não pesquisáveis, não é possível detectar o fim do arquivo, pois isso pode significar ler muito cedo demais no arquivo.
Ou:
sh -c 'trap "echo Ouch" INT; cmd'
Onde o shell pode precisar executar mais comandos depois que o comando "last" for executado.