11
votes

$$ dans un script vs $$ dans un sous-groupe

$$ code> donne un identifiant de processus du processus de script lorsqu'il est utilisé dans un script, comme celui-ci:

Exemple 1 P>

$ ( ps -o cmd,pid,ppid ; echo $$ )
CMD                           PID  PPID
bash                        15073  4657
bash                        15340 15073
ps -o cmd,pid,ppid          15341 15340
15073


0 commentaires

4 Réponses :


6
votes

Le remplacement a lieu dans la coque mère; Le sous-groupe n'a pas été démarré au moment où la substitution a lieu.


5 commentaires

Pouvez-vous s'il vous plaît être peu plus descriptif s'il vous plaît? Je ne suis pas capable de suivre ce que vous dites. Merci!


@ABC: Parce que vos sous-espaces ne vèverent jamais de $$. Il a été invoqué avec (echo 1234) lorsque votre coquille de parent substitue déjà l'argent avec son PID. Vous devez vous échapper, alors le sous-(-shell peut voir l'argent.


@flolo Comment puis-je échapper. Pouvez-vous s'il vous plaît donner le code? J'ai essayé \ $$, $ \ $. Cela n'a rien fait.


Je ne pense pas que vous puissiez vous échapper. Vous pouvez utiliser Bashpid comme mentionné ci-dessus ou plus portable SH -C 'echo $ ppid' .


Oui, cela ne concerne pas qui fait le remplacement; $$ est évalué dans le sous-vase, il est juste d'évaluer intentionnellement au PID de la coque principale comme indique le manuel de Manpage.



9
votes

du manuel Bash:

   $      Expands  to  the  process ID of the shell.  In a () subshell, it
          expands to the process ID of the current  shell,  not  the  sub-
          shell.


2 commentaires

Maintenant, comment puis-je obtenir la valeur de $$ dans le sous-vase, de sorte que je reçois le PID du sous-groupe?


Voir Stackoverflow.com/Questtions/7994762/...



14
votes

J'ai essayé et m'échapper (pour passer l'argent au sous-groupe) ne fonctionne pas car le sous-shell hérite de la valeur $ de la valeur de la parente bash. La solution à cela est d'utiliser $ Bashpid.

(echo $$; echo $BASHPID)


0 commentaires

1
votes

Un moyen plus portable, Linux uniquement, mais également compatible avec Dash: XXX


1 commentaires

Ça me manquait parce que $ Bashpid est seulement pour Bash! sh -c 'echo $$; echo $$ & dormance 5 & dormir 1 & dormance 1; echo $!' Je veux que le deuxième numéro soit égal à la troisième, et $ Bashpid est vide, Donc: SH -C 'Echo $$; Lisez A _ fonctionne, merci!