Selon cela , placer une liste de commandes entre accolades entraîne l'exécution de la liste dans le contexte de shell actuel. Aucun sous-shell n'est créé .
Utiliser ps
pour voir cela en action
Il s'agit de la hiérarchie de processus pour un pipeline de processus exécuté directement sur la ligne de commande. 4398 est le PID du shell de connexion:
sleep 2 | ps -H;
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29696 pts/23 00:00:00 sleep
29697 pts/23 00:00:00 ps
Suit maintenant la hiérarchie des processus pour un pipeline de processus entre accolades exécutés directement sur la ligne de commande. 4398 est le PID du shell de connexion. Elle est similaire à la hiérarchie ci-dessus prouvant que tout est exécuté dans le contexte actuel du shell :
{ sleep 2 | ps -H; }
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29588 pts/23 00:00:00 sleep
29589 pts/23 00:00:00 ps
Maintenant, c'est la hiérarchie du processus lorsque le sleep
dans le pipeline est lui-même placé à l'intérieur des accolades (donc deux niveaux d'accolades en tout)
{ { sleep 2; } | ps -H; }
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29869 pts/23 00:00:00 bash
29871 pts/23 00:00:00 sleep
29870 pts/23 00:00:00 ps
Pourquoi faut bash
-il créer un sous-shell à exécuter sleep
dans le 3ème cas lorsque la documentation indique que les commandes entre accolades sont exécutées dans le contexte actuel du shell?
{ sleep 2 | command ps -H; }