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.