Existen estos dos nombres: un subshell y un shell secundario .
Sí, se iniciará un proceso secundario por cualquiera de estos:
sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
¿Son todos equivalentes y comparten el mismo nombre? ¿Todos comparten las mismas propiedades?
POSIX tiene esta definición :
Un entorno de ejecución de shell consta de ...
Pero el último párrafo del enlace anterior tiene esto:
Se creará un entorno de subshell como duplicado del entorno de shell, excepto que las trampas de señal que no se ignoran se establecerán en la acción predeterminada.
Y especialmente:
La sustitución de comandos, los comandos que están agrupados entre paréntesis y las listas asincrónicas se ejecutarán en un entorno de subshell. Además, cada comando de una tubería de comandos múltiples se encuentra en un entorno de subshell; ....
El sh -c 'echo "Hello"'
no está incluido allí, ¿debería eso llamarse también una subshell?
sh -c
: es un subproceso que casualmente es un shell.bash -c <command>
, después de bifurcar el shell y luego ejecutarbash -c <command>
, se crea un shell bash. Entonces, ¿se utiliza la llamada del sistema para ejecutar<command>
nuevamente bifurcar el shell bash y ejecutar<command>
?Un entorno de shell secundario no necesita vivir en un proceso separado, solo necesita duplicar el entorno de ejecución actual. En
ksh93
esto se realiza mediante unvirtual sub-shell
mecanismo que no llamafork()
. Esto hace que ksh93 sea muy rápido en plataformas arcaicas comoWin-DOS
, ya queWin-DOS
es extremadamente lento con la bifurcación.sh -c cmd
Por otro lado, crea un nuevo proceso con el shell predeterminado que no necesita ser el mismo que su shell interactivo actual.Incluso cuando
sh
su shell actual sea idéntico, esto no duplica el entorno de ejecución y, por lo tanto, no crea unsub-shell
.fuente
ksh93
, subshell es un shell hijo ¿verdad?