GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es una subcapa lo mismo que una capa secundaria?

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.

Relacionado:¿Redirigir una salida de una subcapa a un proceso?

Páginas man relevantes:fork(2), execve(2).


Linux
  1. ¿Hacer referencia a un archivo en el mismo directorio de un script encontrado en $ruta?

  2. ¿Ejecutar un comando Sudo, especificando la contraseña en la misma línea?

  3. ¿La salida se guardará en un archivo con el mismo nombre que el archivo de entrada?

  4. ¿Son tar.gz y tgz lo mismo?

  5. ¿Por qué el núcleo se asigna al mismo espacio de direcciones que los procesos?

Cómo ejecutar diferentes versiones de PHP en el mismo servidor

¿Los paréntesis realmente ponen el comando en una subcapa?

Salida a Stdout y al mismo tiempo Grep en un archivo?

¿Cómo montar una partición Truecrypt encriptada siempre en el mismo punto?

¿No puede encontrar .so en el mismo directorio que el ejecutable?

¿En qué se parecen el tiempo de CPU y el uso de CPU?