com bash
:
echo "$BASHPID"
daria o pid do processo que avalia o comando echo
Note que (por exemplo, após um enable -n echo
) não é necessariamente o mesmo que o pid do processo que está executando esse comando echo
.
bash
(ou qualquer shell) faz sua própria sopa com processos. Nem sempre é útil tentar adivinhar que processo faz o quê.
$ readlink -f /proc/self "/proc/$BASHPID"
/proc/30868
/proc/30747
$ (readlink -f /proc/self "/proc/$BASHPID")
/proc/30869
/proc/30869
Nesse segundo caso, readlink
é executado no mesmo processo que interpretou a linha de comando porque esse é o último comando executado nessa sub-rotina (portanto, bash
otimiza um fork()
).
O zsh
equivalente está no módulo zsh/system
:
$ zmodload zsh/system
$ echo $$ $sysparams[pid]
5155 5155
$ (echo $$ $sysparams[pid])
5155 30979
( zsh
também expõe o pid pai do subshell em $sysparams[ppid]
).
Portavelmente, você pode fazer:
pid=$(sh -c 'echo "$PPID"')
Todos os shells devem executar esse sh
como um filho direto da subshell interpretando essa linha de comando, para que sh
' $PPID
seja a subcamada.