Quelles sont toutes les façons de créer un sous-shell dans bash?

Il y a 2 façons principales que je connais jusqu'à présent:

  • Explicitement : enveloppant des parenthèses autour d'une list de commands

  • Implicitement : chaque command dans un pipeline

Existe-t-il d'autres moyens, explicites ou implicites, dans lesquels on crée des sous-shells dans bash?

De l' man bash :

  • Si une command est terminée par l'opérateur de contrôle & , le shell exécute la command en arrière-plan dans un sous-shell. Le shell n'attend pas la fin de la command et le statut de return est 0.
  • Un coprocess est une command shell précédée par le mot réservé coproc .
    Un coprocess est exécuté de façon asynchronous dans un sous-shell, comme si la command avait été terminée avec l'opérateur & control
  • Shell builtin complete command: lorsqu'elle est appelée avec l'option -C command , la command est exécutée dans un environnement sous-shell et sa sortie est utilisée comme complétion possible.
  • La substitution de command, les commands groupées avec des parenthèses et les commands asynchronouss sont appelées dans un environnement sous-shell qui est un doublon de l'environnement du shell

Cela dépend de ce que vous entendez par "sous-coquille". Et vous pouvez manquer le point dans votre "chaque command dans un pipeline" balle.

Chaque fois que vous exécutez un programme (externe) (par exemple, un script ou un exécutable binary, contrairement à un shell embedded), à less que vous n'utilisiez le exec program , vous l'exécutez dans un sous-process. Le shell fourche et exécute le programme. ls | wc ls | wc ne crée pas un sous-shell plus que ls et wc font seul.

La chose intéressante est que l'inclure dans un pipeline peut provoquer l'exécution d'un shell dans un sous-shell. Considérez cet exemple:

  $ read v
 cat # C'est l'input saisie par l'user.

 $ echo "$ v"
 chat

 $ echo cougar |  lire v

 $ echo "$ v"
 chat 

La seconde command read v est exécutée dans un sous-shell car elle fait partie de l' echo cougar | read v echo cougar | read v pipeline. Par conséquent, la valeur cougar est perdue et $v conserve sa première valeur.

De même, les commands comme

 $ echo foo | cd / $ cd / | cat $ echo foo | exit $ exit | cat 

n'affecte pas la coquille principale.