¿Cómo puedo obtener el pid de una subshell?
Por ejemplo:
$ echo $$
16808
Esto no funciona porque el shell original se expande $$:
$ ( echo $$ )
16808
¿Por qué no funciona la comilla simple? Después de que el shell original elimina la comilla simple, ¿el subshell no se expande $$en sí mismo?
$ ( echo '$$' )
$$
¿Por qué tampoco evalfunciona? ¿Es evalejecutado por la subshell? ¿Por qué me da el PID del shell original?
$ ( eval echo '$$' )
16808
Gracias.

$$expansión" frente a "pid diferente en el subshell").Respuestas:
Además de
bash's$BASHPID, puede hacerlo de forma portátil con:Ejemplo:
Puedes convertirlo en una función:
Observe que algunos shells (p. Ej.
zshOksh93) NO inician un subproceso para cada subshell creado con(...); en ese caso,$pidpuede terminar siendo el mismo$$, lo cual es correcto, porque ese es el PID del procesogetpiddesde el que se llamó.fuente
ksh93, por ejemplo.(...)ejemplo que puede no generar un proceso separado, como lo hace enbash.zshuyashoptimizan afork()para el último comando en un subshell. Incluso pueden optimizar la bifurcación para la subshell si es el último comando en un script paragetpidque incluso pueda informar al padre$$. Puede definirgetpidcomo:getpid(){ sh -c 'echo "$PPID"'; return; }para deshabilitar evitar el problema.execo sin esa optimización, elsh -c ...proceso será un nieto, en lugar de un hijo del proceso donde$(...)se usa una sustitución de comando, y$PPIDserá el pid de la$(...)subshell. Eso es exactamente lo que sucede en el ejemploset -E+trap ERRbash anterior.test "$1"prueba si$1es una cadena vacía o no, una forma rápida y sucia de probar si esa función recibió unvarnameargumento para asignar o no el pid; El uso de una función no era la idea más brillante en primer lugar.Del manual:
Relacionado:
fuente
$$en subcapas.$BASHPIDen una variable y usarlo en el subshell. Existe$PPID, pero ese es el PID primario del shell en el mismo sentido que$$el PID del shell (no se restablece en un subshell). No hay$BASHPPIDvariable