¿Es un subshell lo mismo que un shell secundario?

¿Es un subshell lo mismo que un shell secundario?

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 elforkllamada 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 shes dash), es decir, un programa completamente diferente que tiene similitudes significativas en su comportamiento. Debajo del capó, al ejecutar un comando externo ( sho cualquier otro) se llama a la forkllamada al sistema y luego alexecvellamada 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 ksh93se hace mediante un virtual sub-shellmecanismo que no llama fork(). Esto hace que ksh93 sea muy rápido en plataformas arcaicas como Win-DOS, y Win-DOSextremadamente lento con la bifurcación.

sh -c cmden el otro lado, crea un nuevo proceso con el shell predeterminado que no necesita ser el mismo que su shell interactivo actual.

Incluso cuando shy su shell actual son idénticos, esto no duplica el entorno de ejecución y, por lo tanto, no crea un archivo sub-shell.

información relacionada