Quais são todas as maneiras de criar um subshell no bash?

Quais são todas as maneiras de criar um subshell no bash?

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 coprocpalavra 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 programls | wclswc

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 vcomando é executado em um subshell porque faz parte do echo cougar | read vpipeline. Portanto, o valor cougaré perdido e $vmanté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.

informação relacionada