Como posso obter o pid de um subshell? [duplicado]

4

Como posso obter o pid de um subshell?

Por exemplo:

$ echo $$
16808

Isso não funciona, porque o shell original expande $$ :

$ ( echo $$ )
16808

Por que a citação única não funciona? Depois que o shell original remover a aspa simples, a subshell não expandirá $$ em si?

$ ( echo '$$' )
$$

Por que eval não funciona? eval é executado pelo subshell? Por que me dá o PID do shell original?

$ ( eval echo '$$' )
16808

Obrigado.

    
por Tim 27.11.2018 / 14:23

2 respostas

3

Além de bash ' $BASHPID , você pode portá-lo com:

pid=$(exec sh -c 'echo "$PPID"')

Exemplo:

(pid=$(exec sh -c 'echo "$PPID"'); echo "$$ $pid")

Você pode transformá-lo em uma função:

# usage getpid [varname]
getpid(){
    pid=$(exec sh -c 'echo "$PPID"')
    test "$1" && eval "$1=\$pid"
}

Observe que alguns shells (por exemplo, zsh ou ksh93 ) NÃO iniciam um subprocesso para cada subshell criado com (...) ; Nesse caso, $pid pode ser o mesmo que $$ , o que é correto, porque esse é o PID do processo getpid foi chamado.

    
por 27.11.2018 / 16:00
13
$ echo $BASHPID
37152
$ ( echo $BASHPID )
18633

Do manual:

BASHPID

Expands to the process ID of the current bash process. This differs from $$ under certain circumstances, such as subshells that do not require bash to be re-initialized.

$

Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the current shell, not the subshell.

Relacionados:

por 27.11.2018 / 14:34