web-dev-qa-db-fra.com

Comment puis-je obtenir le PID d'un sous-vase?

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.

12
Tim

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.

12
mosvy
$ 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:

18
Kusalananda