Existem duas maneiras principais que conheço até agora:
Explicitamente: envolvendo parênteses em torno de uma lista de comandos
Implicitamente: cada comando em um pipeline
Existem mais maneiras, explícita ou implicitamente, de criar subshells no bash?
Responder1
De man bash
:
- Se um comando for finalizado pelo operador de controle
&
, o shell executará o comando em segundo plano em um subshell. O shell não espera a conclusão do comando e o status de retorno é 0. - Um coprocesso é um comando shell precedido pela
coproc
palavra reservada.
Um coprocesso é executado de forma assíncrona em um subshell, como se o comando tivesse sido finalizado com o operador & control - Comando interno do Shell
complete
: quando chamado com a-C command
opção,command
é executado em um ambiente subshell e sua saída é usada como possíveis conclusões. - Substituição de comandos, comandos agrupados entre parênteses e comandos assíncronos são invocados em um ambiente subshell que é uma duplicata do ambiente shell
Responder2
Depende do que você entende por “subshell”. E você pode estar perdendo o objetivo do marcador “cada comando em um pipeline”.
Sempre que você correqualquerprograma (externo) (ou seja, um script ou executável binário, em contraste com um shell embutido), a menos que você use , você o executa em um subprocesso (ou processos). O shell bifurca e executa o programa. não cria um subshell mais do que faz sozinho.exec program
ls | wc
ls
wc
O interessante é que incluí-lo em um pipeline pode causarum shell embutidopara executar em um subshell. Considere este exemplo:
$ leia v gato # Esta é uma entrada digitada pelo usuário. $ eco "$v" gato $ eco puma | leia v $ eco "$v" gato
O segundo read v
comando é executado em um subshell porque faz parte do echo cougar | read v
pipeline. Portanto, o valor cougar
é perdido e $v
mantém o seu primeiro valor.
Da mesma forma, comandos como
$ echo foo | cd /
$ cd / | cat
$ echo foo | exit
$ exit | cat
não afeta o shell principal.