
Existem dois nomes: umsubnívele umconcha infantil.
Sim, um processo filho será iniciado por qualquer um destes:
sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
Todos são equivalentes e compartilham o mesmo nome? Todos compartilham as mesmas propriedades?
POSIXtem essa definição:
Um ambiente de execução shell consiste em ....
Mas o último parágrafo do link acima tem o seguinte:
Um ambiente subshell deve ser criado como uma duplicata do ambiente shell, exceto que as interceptações de sinal que não estão sendo ignoradas devem ser definidas como a ação padrão.
E especialmente:
Substituição de comandos, comandos agrupados entre parênteses e listas assíncronas devem ser executados em um ambiente subshell. Além disso, cada comando de um pipeline multicomando está em um ambiente subshell; ....
O sh -c 'echo "Hello"'
não está incluído aí, deveria ser chamado de subshell também?
Responder1
Um subnívelduplicataso shell existente. Possui as mesmas variáveis¹, as mesmas funções, as mesmas opções, etc. Nos bastidores, um subshell é criado com ofork
chamada de sistema²; o processo filho continua fazendo o que é esperado dele enquanto o pai espera (por exemplo, $(…)
) ou continua com sua vida (por exemplo, … &
) ou então faz o que é esperado dele (por exemplo, … | …
).
sh -c …
não cria um subshell. Ele lança outro programa. Acontece que esse programa é um shell, mas isso é apenas uma coincidência. O programa pode até ser um shell diferente (por exemplo, se você executar sh -c …
a partir do bash e sh
for do dash), ou seja, um programa completamente diferente que por acaso possui semelhanças significativas em seu comportamento. Nos bastidores, iniciar um comando externo ( sh
ou qualquer outro) chama a fork
chamada do sistema e, em seguida, oexecve
chamada do sistema parasubstituiro programa shell no subprocesso por outro programa (aqui sh
).
¹ Incluindo $$
, mas excluindo algumas variáveis específicas do shell, como bash e mksh BASHPID
.
² Pelo menos essa é a implementação tradicional e usual. Os shells podem otimizar o fork se puderem imitar o comportamento de outra forma. VerQual é a diferença exata entre um “subshell” e um “processo filho”?
Páginas de manual relevantes:garfo (2),executivo(2).
Responder2
Um ambiente sub-shell não precisa residir em um processo separado, ele apenas precisa duplicar o ambiente de execução atual. Isso ksh93
é feito por um virtual sub-shell
mecanismo que não chama fork()
. Isso torna o ksh93 muito rápido em plataformas arcaicas como o Win-DOS
, assim como Win-DOS
é extremamente lento com a bifurcação.
sh -c cmd
por outro lado, cria um novo processo com o shell padrão que não precisa ser igual ao seu shell interativo atual.
Mesmo quando sh
e seu shell atual são idênticos, isso não duplica o ambiente de execução e, portanto, não cria um arquivo sub-shell
.