
Existen estos dos nombres: unsubcapay uncaparazón infantil.
Sí, un proceso hijo se iniciará mediante 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?
POSIXtiene 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 un duplicado del entorno de shell, excepto que las trampas de señales que no se ignoren se establecerán en la acción predeterminada.
Y especialmente:
La sustitución de comandos, los comandos agrupados entre paréntesis y las listas asíncronas se ejecutarán en un entorno de subshell. Además, cada comando de una canalización de comandos múltiples se encuentra en un entorno de subcapa; ....
No está sh -c 'echo "Hello"'
incluido allí, ¿debería llamarse subcapa también?
Respuesta1
Una subcapaduplicadosel caparazón existente. Tiene las mismas variables¹, las mismas funciones, las mismas opciones, etc. Debajo del capó, se crea una subcapa con elfork
llamada al sistema²; el proceso hijo continúa haciendo lo que se espera de él mientras el padre espera (por ejemplo, $(…)
) o continúa con su vida (por ejemplo, … &
) o de otro modo hace lo que se espera de él (por ejemplo, … | …
).
sh -c …
no crea una subcapa. Lanza otro programa. Ese programa resulta ser un shell, pero es sólo una coincidencia. El programa puede incluso ser un shell diferente (por ejemplo, si ejecuta sh -c …
desde bash y sh
es dash), es decir, un programa completamente diferente que tiene similitudes significativas en su comportamiento. Debajo del capó, al ejecutar un comando externo ( sh
o cualquier otro) se llama a la fork
llamada al sistema y luego alexecve
llamada al sistema parareemplazarel programa shell en el subproceso por otro programa (aquí sh
).
¹ Incluyendo $$
, pero excluyendo algunas variables específicas del shell como bash y mksh BASHPID
.
² Al menos, esa es la implementación tradicional y habitual. Los shells pueden optimizar la bifurcación si pueden imitar el comportamiento de otra manera. Ver¿Cuál es la diferencia exacta entre una "subcapa" y un "proceso hijo"?
Páginas de manual relevantes:tenedor(2),ejecutivo(2).
Respuesta2
Un entorno de subshell no necesita vivir en un proceso separado, solo necesita duplicar el entorno de ejecución actual. Esto ksh93
se hace mediante un virtual sub-shell
mecanismo que no llama fork()
. Esto hace que ksh93 sea muy rápido en plataformas arcaicas como Win-DOS
, y Win-DOS
extremadamente lento con la bifurcación.
sh -c cmd
en el otro lado, crea un nuevo proceso con el shell predeterminado que no necesita ser el mismo que su shell interactivo actual.
Incluso cuando sh
y su shell actual son idénticos, esto no duplica el entorno de ejecución y, por lo tanto, no crea un archivo sub-shell
.