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.