¿Cuáles son todas las formas de crear un subshell en bash?

¿Cuáles son todas las formas de crear un subshell en bash?

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 coprocpalabra reservada.
    Un coproceso se ejecuta de forma asíncrona en un subshell, como si el comando hubiera terminado con el operador de control &
  • completeComando incorporado del Shell : cuando se llama con la -C command opción, commandse 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 programls | wclswc

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 vcomando se ejecuta en un subshell porque es parte de la echo cougar | read vcanalización. Por tanto, el valor cougarse pierde y $vconserva su primer valor.

Asimismo, comandos como

$ echo foo | cd /

$ cd / | cat

$ echo foo | exit

$ exit | cat

No afecta el caparazón principal.

información relacionada