Hay estos dos nombres:un subshell y un niño-shell .
Sí, un proceso secundario se iniciará con 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 un duplicado del entorno de shell, excepto que las trampas de señal que no se ignoren se establecerán en la acción predeterminada.
Y especialmente:
La sustitución de comandos, los comandos que se agrupan entre paréntesis y las listas asíncronas se ejecutarán en un entorno de subcapa. Además, cada comando de una canalización de múltiples comandos se encuentra en un entorno de subcapa; ….
El sh -c 'echo "Hello"'
no está incluido allí, ¿debería llamarse subcapa también?
Respuesta aceptada:
Una subcapa duplica el caparazón existente. Tiene las mismas variables¹, las mismas funciones, las mismas opciones, etc. Debajo del capó, se crea una subcapa con el fork
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 hace lo que se espera de él (por ejemplo, … | …
).
sh -c …
no crea una subcapa. Lanza otro programa. Ese programa resulta ser un caparazón, pero eso es solo una coincidencia. El programa puede incluso ser un shell diferente (por ejemplo, si ejecuta sh -c …
de bash, y sh
es guión), es decir, un programa completamente diferente que tiene similitudes significativas en su comportamiento. Debajo del capó, lanzando un comando externo (sh
o cualquier otro) llama al fork
llamada al sistema y luego execve
llamada al sistema para reemplazar el programa shell en el subproceso por otro programa (aquí sh
).
¹ Incluido $$
, pero excluyendo algunas variables específicas de shell como bash y BASHPID
de mksh .
² Al menos, esa es la implementación tradicional y habitual. Las conchas pueden optimizar la bifurcación si pueden imitar el comportamiento de lo contrario.
Páginas man relevantes:fork(2), execve(2).