Hay 2 formas principales que conozco hasta ahora:
Explícitamente: envuelve entre paréntesis una lista de comandos
Implícitamente: cada comando en una canalización
¿Hay más formas, ya sea explícita o implícitamente, de crear subcapas en bash?
Respuesta1
De man bash
:
- Si el operador de control finaliza un comando
&
, el shell ejecuta el comando en segundo plano en un subshell. El shell no espera a que finalice el comando y el estado de retorno es 0. - Un coproceso es un comando de shell precedido por la
coproc
palabra reservada.
Un coproceso se ejecuta de forma asíncrona en un subshell, como si el comando hubiera terminado con el operador de control & complete
Comando incorporado del Shell : cuando se llama con la-C command
opción,command
se ejecuta en un entorno de subshell y su salida se utiliza como posibles finalizaciones.- La sustitución de comandos, los comandos agrupados entre paréntesis y los comandos asincrónicos se invocan en un entorno de subshell que es un duplicado del entorno de shell.
Respuesta2
Depende de lo que quieras decir con "subcapa". Y es posible que no haya entendido el punto de su viñeta "todos los comandos en una tubería".
Cada vez que correscualquierprograma (externo) (es decir, un script o ejecutable binario, a diferencia de un shell incorporado), a menos que use , lo ejecuta en un subproceso (o procesos). El shell bifurca y ejecuta el programa. no crea una subcapa más que y lo hace solo.exec program
ls | wc
ls
wc
Lo interesante es que incluirlo en un pipeline puede causarun caparazón incorporadoejecutar en una subcapa. Considere este ejemplo:
$ leer v gato # Esta es una entrada escrita por el usuario. $ eco "$v" gato $ eco puma | leer v $ eco "$v" gato
El segundo read v
comando se ejecuta en un subshell porque es parte de la echo cougar | read v
canalización. Por tanto, el valor cougar
se pierde y $v
conserva su primer valor.
Asimismo, comandos como
$ echo foo | cd /
$ cd / | cat
$ echo foo | exit
$ exit | cat
No afecta el caparazón principal.