Existem esses dois nomes: um subshell e um shell filho .
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?
O POSIX possui esta definição :
Um ambiente de execução de shell consiste em ....
Mas o último parágrafo do link acima tem o seguinte:
Um ambiente de subcasca deve ser criado como uma duplicata do ambiente de shell, exceto que os traps de sinal que não estão sendo ignorados devem ser configurados para a ação padrão.
E especialmente:
A substituição de comandos, os comandos agrupados entre parênteses e as listas assíncronas devem ser executadas em um ambiente de subcasca. Além disso, cada comando de um pipeline de comandos múltiplos está em um ambiente de subcasca; ....
O sh -c 'echo "Hello"'
não está incluído lá, isso também deve ser chamado de subshell?
sh -c
: esse é um subprocesso que por coincidência é um shell.bash -c <command>
, depois de bifurcar o shell e, em seguidabash -c <command>
, executar , um shell bash é criado. Então, a chamada do sistema usada para executar<command>
novamente bifurca o shell bash e executa<command>
?Um ambiente de subcasca não precisa viver em um processo separado, apenas duplicar o ambiente de execução atual. Em
ksh93
isso é feito por umvirtual sub-shell
mecanismo que não chamafork()
. Isso torna o ksh93 muito rápido em plataformas arcaicasWin-DOS
, comoWin-DOS
é extremamente lento com o 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 umsub-shell
.fonte
ksh93
, exceto , subshell é um shell filho, certo?