Comment puis-je obtenir le PID d'un sous-vase?
Par exemple:
$ echo $$
16808
Cela ne fonctionne pas, car la coquille d'origine se développe $$
:
$ ( echo $$ )
16808
Pourquoi la citation unique ne fonctionne-t-elle pas? Une fois que la coque d'origine supprime la citation unique, le sous-rattrapage n'est-il pas développé $$
en soi?
$ ( echo '$$' )
$$
Pourquoi eval
ne fonctionne pas non plus? eval
est-il exécuté par le sous-groupe? Pourquoi me donne-t-il le pid d'origine de la coquille?
$ ( eval echo '$$' )
16808
Merci.
En plus de bash
's $BASHPID
, vous pouvez le faire de manière portant avec:
pid=$(exec sh -c 'echo "$PPID"')
Exemple:
(pid=$(exec sh -c 'echo "$PPID"'); echo "$$ $pid")
Vous pouvez en faire une fonction:
# usage getpid [varname]
getpid(){
pid=$(exec sh -c 'echo "$PPID"')
test "$1" && eval "$1=\$pid"
}
Notez que certains obus (par exemple, zsh
ou ksh93
) Ne démarrez pas une sous-processus pour chaque sous-groupe créé avec (...)
; dans ce cas, $pid
peut être fini par être la même chose que $$
, qui est juste, car c'est le PID du processus getpid
a été appelé à partir de.
$ echo $BASHPID
37152
$ ( echo $BASHPID )
18633
Du manuel:
BASHPID
Se développe à l'ID de processus du processus de bash actuel. Cela diffère de
$$
Dans certaines circonstances, telles que des sous-vases qui n'exigent pas Bash d'être réinitialisées.
$
Se développe à l'ID de processus de la coquille. Dans un
()
Subshell, il se développe à l'ID de processus de la coque actuelle, pas du sous-groupe.
En rapport: