Siguiendo la respuesta de @Gilles que encontré al resolver otro problema que tenía, preparé un programa de prueba rápida que sustenta la teoría de que la respuesta correcta es:
MYPID=$(exec sh -c 'echo $PPID')
Descubrí que hay momentos en exec
que no es necesario, pero confirmó que usarlo es la única forma de obtener el pid correcto todo el tiempo en todos los shells que probé. Aquí está mi prueba:
#!/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)"
y su salida
------
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
Sustituir su shell favorito en el tinglado: sh
, bash
, mksh
, ksh
, etc ...
No entiendo por qué los casos 2 y 3 dan resultados diferentes, ni por qué los resultados para el caso 3 difieren entre los shells. Probé bash
, ksh
y mksh
en Arch Linux Fwiw.