Suite à la réponse de @Gilles que j'ai rencontrée tout en résolvant un autre problème que j'avais, j'ai élaboré un programme de test rapide qui sous-tend la théorie selon laquelle la bonne réponse est:
MYPID=$(exec sh -c 'echo $PPID')
J'ai trouvé qu'il y a des moments où ce exec
n'est pas nécessaire mais j'ai confirmé que son utilisation est le seul moyen d'obtenir le bon pid tout le temps dans tous les shells que j'ai essayés. Voici mon test:
#!/bin/sh
pids() {
echo ------
pstree -pg $PPID
echo 'PPID = ' $PPID
echo '$$ = ' $$
echo 'BASHPID =' $BASHPID
echo -n 'sh -c echo $PPID = '; sh -c 'echo $PPID'
echo -n '$(sh -c '\''echo $PPID'\'') = '; echo $(sh -c 'echo $PPID')
echo -n '$(exec sh -c '\''echo $PPID'\'') = '; echo $(exec sh -c 'echo $PPID')
echo -n 'p=$(sh -c '\''echo $PPID'\'') = '; p=$(sh -c 'echo $PPID') ; echo $p
echo -n 'p=$(exec sh -c '\''echo $PPID'\'') = '; p=$(exec sh -c 'echo $PPID') ; echo $p
}
pids
pids | cat
echo -e "$(pids)"
et sa sortie
------
bash(5975,5975)---pidtest(13474,13474)---pstree(13475,13474)
PPID = 5975
$$ = 13474
BASHPID = 13474
sh -c echo $PPID = 13474
$(sh -c 'echo $PPID') = 13474
$(exec sh -c 'echo $PPID') = 13474
p=$(sh -c 'echo $PPID') = 13474
p=$(exec sh -c 'echo $PPID') = 13474
------
bash(5975,5975)---pidtest(13474,13474)-+-cat(13482,13474)
`-pidtest(13481,13474)---pstree(13483,13474)
PPID = 5975
$$ = 13474
BASHPID = 13481
sh -c echo $PPID = 13481
$(sh -c 'echo $PPID') = 13481
$(exec sh -c 'echo $PPID') = 13481
p=$(sh -c 'echo $PPID') = 13481
p=$(exec sh -c 'echo $PPID') = 13481
------
bash(5975,5975)---pidtest(13474,13474)---pidtest(13489,13474)---pstree(13490,13474)
PPID = 5975
$$ = 13474
BASHPID = 13489
sh -c echo $PPID = 13489
$(sh -c 'echo $PPID') = 13492
$(exec sh -c 'echo $PPID') = 13489
p=$(sh -c 'echo $PPID') = 13495
p=$(exec sh -c 'echo $PPID') = 13489
Remplacez votre coque préférée dans le tralala: sh
, bash
, mksh
, ksh
, etc ...
Je ne comprends pas pourquoi les cas 2 et 3 donnent des résultats différents, ni pourquoi les résultats du cas 3 diffèrent entre les obus. J'ai essayé bash
, ksh
et mksh
sur Arch Linux FWIW.