Um sub-shell é a mesma coisa que um shell filho

Um sub-shell é a mesma coisa que um shell filho

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 oforkchamada 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 shfor do dash), ou seja, um programa completamente diferente que por acaso possui semelhanças significativas em seu comportamento. Nos bastidores, iniciar um comando externo ( shou qualquer outro) chama a forkchamada do sistema e, em seguida, oexecvechamada 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-shellmecanismo 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 cmdpor outro lado, cria um novo processo com o shell padrão que não precisa ser igual ao seu shell interativo atual.

Mesmo quando she 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.

informação relacionada