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

4

Existem duas maneiras principais que eu conheço até agora:

  • Explicitamente : envolvendo parênteses em torno de uma lista de comandos

  • Implicitamente : todos os comandos em um pipeline

Existem mais maneiras, explícita ou implicitamente, nas quais se cria subshells no bash?

    
por Nadim Hussami 13.04.2017 / 20:49

2 respostas

5

De man bash :

  • Se um comando for finalizado pelo operador de controle & , o shell executa o comando no fundo em uma subcamada. O shell não espera para o comando terminar e o status de retorno é 0.
  • Um coprocess é um comando shell precedido pela palavra coproc reservada.
    Um coprocess é executado de forma assíncrona em um subshell, como se o comando foi terminado com o & operador de controle
  • Comando do shell interno complete : quando chamado com o -C command opção, command é executado em um ambiente subshell, e sua saída é usada como as possíveis conclusões.
  • Substituição de comandos, comandos agrupados com parênteses e comandos assíncronos são invocados em um ambiente subshell que é um duplicata do ambiente de shell
por 13.04.2017 / 21:10
0

Depende do que você quer dizer com "subshell". E você pode estar perdendo o ponto em seu "cada comando em um pipeline".

Sempre que você executar qualquer programa (externo) (isto é, um script ou executável binário, em contraste com um shell embutido), a menos que você use exec program , você o executa em um subprocesso (ou processos). O shell bifurca e executa o programa. ls | wc não cria um subshell mais do que ls e wc sozinho.

O interessante é que incluí-lo em um pipeline pode causar um shell embutido para ser executado em um subshell. Considere este exemplo:

$ read v
cat                                     # This is input typed by the user.

$ echo "$v"
cat

$ echo cougar | read v

$ echo "$v"
cat

O segundo comando read v é executado em um subshell porque faz parte do echo cougar | read v pipeline. Portanto, o valor cougar é perdido e $v mantém seu primeiro valor.

Da mesma forma, comandos como

$ echo foo | cd /

$ cd / | cat

$ echo foo | exit

$ exit | cat

não afeta o shell principal.

    
por 13.04.2017 / 22:40

Tags