Comment obtenir le pid d'un sous-shell?
Par exemple:
$ echo $$
16808
Cela ne fonctionne pas, car le shell d'origine se développe $$
:
$ ( echo $$ )
16808
Pourquoi les guillemets simples ne fonctionnent-ils pas? Une fois que le shell d'origine a supprimé le guillemet simple, le sous-shell ne se développe $$
-t -il pas en soi?
$ ( echo '$$' )
$$
Pourquoi ça eval
ne marche pas non plus? Est eval
géré par le sous-shell? Pourquoi me donne-t-il le PID de la coque d'origine?
$ ( eval echo '$$' )
16808
Merci.
$$
expansion" vs "pid différent en sous-shell").Réponses:
En plus de
bash
's$BASHPID
, vous pouvez le faire de manière portable avec:Exemple:
Vous pouvez en faire une fonction:
Notez que certains shells (par exemple.
zsh
Ouksh93
) ne démarrent PAS un sous-processus pour chaque sous-shell créé avec(...)
; dans ce cas,$pid
peut finir par être le même que$$
, ce qui est juste, car c'est le PID du processus qui agetpid
été appelé.la source
ksh93
, par exemple.(...)
l'exemple de l'exemple qui peut ne pas engendrer un processus séparé, comme il le fait dansbash
.zsh
ouyash
optimisent unfork()
pour la dernière commande d'un sous-shell. Ils peuvent même optimiser la fourchette du sous-shell s'il s'agit de la dernière commande d'un script afin que vousgetpid
puissiez même signaler le parent de$$
. Vous pouvez définirgetpid
comme:getpid(){ sh -c 'echo "$PPID"'; return; }
pour désactiver, éviter le problème.exec
ou sans cette optimisation, lesh -c ...
processus sera un petit-enfant, au lieu d'un enfant du processus où une$(...)
substitution de commande est utilisée, et$PPID
sera le pid du$(...)
sous - shell. C'est exactement ce qui se passe dans l' exempleset -E
+trap ERR
bash ci-dessus.test "$1"
teste s'il$1
s'agit d'une chaîne vide ou non - un moyen rapide et sale de tester si cette fonction a reçu unvarname
argument pour assigner ou non le pid; utiliser une fonction n'était pas l' idée la plus brillante en premier lieu.Du manuel:
En relation:
la source
$$
dans les sous-coquilles.$BASHPID
dans une variable et l'utiliser dans le sous-shell. Oui$PPID
, mais c'est le PID parent du shell dans le même sens que$$
le PID du shell (il n'est pas réinitialisé dans un sous-shell). Il n'y a pas de$BASHPPID
variable.