¿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 eval
funciona? ¿Es eval
ejecutado 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.
zsh
Oksh93
) NO inician un subproceso para cada subshell creado con(...)
; en ese caso,$pid
puede terminar siendo el mismo$$
, lo cual es correcto, porque ese es el PID del procesogetpid
desde el que se llamó.fuente
ksh93
, por ejemplo.(...)
ejemplo que puede no generar un proceso separado, como lo hace enbash
.zsh
uyash
optimizan 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 paragetpid
que incluso pueda informar al padre$$
. Puede definirgetpid
como:getpid(){ sh -c 'echo "$PPID"'; return; }
para deshabilitar evitar el problema.exec
o 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$PPID
será el pid de la$(...)
subshell. Eso es exactamente lo que sucede en el ejemploset -E
+trap ERR
bash anterior.test "$1"
prueba si$1
es una cadena vacía o no, una forma rápida y sucia de probar si esa función recibió unvarname
argumento 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.$BASHPID
en 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$BASHPPID
variable