Como posso obter o pid de um subshell?
Por exemplo:
$ echo $$
16808
Isso não funciona, porque o shell original se expande $$
:
$ ( echo $$ )
16808
Por que as aspas simples não funcionam? Depois que o shell original remove as aspas simples, o subshell não se expande $$
sozinho?
$ ( echo '$$' )
$$
Por que também eval
não funciona? É eval
executado pelo subshell? Por que me dá o PID do shell original?
$ ( eval echo '$$' )
16808
Obrigado.
Do manual:
Relacionado:
Além de
bash
's$BASHPID
, você pode fazer isso de forma portátil com:Exemplo:
Você pode transformá-lo em uma função:
Observe que alguns shells (por exemplo ,
zsh
orksh93
) NÃO iniciam um subprocesso para cada subshell criado com(...)
; nesse caso,$pid
pode acabar sendo igual a$$
, o que é correto, pois é o PID de onde o processogetpid
foi chamado.No Linux, uma solução cross-shell (pelo menos dash, bash, zsh) que não gera um novo processo é
Pelo menos no bash e no zsh também podemos usar o espaço como delimitador de leitura:
Veja também a seção man 5 proc /proc/[pid]/stat