web-dev-qa-db-fra.com

Règle pour invoquer le sous-vase à Bash?

Je semble mal comprendre la règle de bash pour créer un sous-vase. Je pensais que les parenthèses créent toujours un sous-vase, qui fonctionne comme son propre processus.

Cependant, cela ne semble pas être le cas. Dans le snippet de code A (ci-dessous), la commande sleep _ ne fonctionne pas dans une coque séparée (comme déterminé par pstree dans un autre terminal). Cependant, dans le code de code B, la deuxième commande sleep est exécutée dans une coque séparée. La seule différence entre les extraits est que le deuxième extrait a deux commandements dans les parenthèses.

Quelqu'un pourrait-il s'il vous plaît expliquer la règle de la création de sous-vases?

Code Snippet A :

sleep 5
(
sleep 5
)

Code Snippet B :

sleep 5
(
x=1
sleep 5
)
26
bashful

À partir du Guide de programmation Advanced Bash :

"En général, une commande externe dans une fourchette de script désactivée d'un sous-processus, tandis qu'une Bash intégrée ne le fait pas. Pour cette raison, des produits s'exécutent plus rapidement et utilisent moins de ressources système à leurs équivalents de commande externes."

Et un peu plus loin:

"Une liste de commandes intégrée entre parenthèses fonctionne comme un sous-vase."

Exemples:

[root@talara test]# echo $BASHPID
10792
[root@talara test]# (echo $BASHPID)
4087
[root@talara test]# (echo $BASHPID)
4088
[root@talara test]# (echo $BASHPID)
4089

Exemple Utilisation du code OPS (avec des dort plus courts parce que je suis impatient):

echo $BASHPID

sleep 2
(
    echo $BASHPID
    sleep 2
    echo $BASHPID
)

Le résultat:

[root@talara test]# bash sub_bash
6606
6608
6608
4
Tim