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
:
&
, 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. coproc
. 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. 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.