No bash, você tem esta variável útil: $ BASHPID, que sempre retorna o PID do subshell em execução no momento. Como posso obter o PID de um subshell em ksh? Por exemplo, veja o código abaixo:
#!/usr/bin/ksh93
echo "PID at start: $$"
function run_in_background {
echo "PID in run_in_background $$"
run_something &
echo "PID of backgrounded run_something: $!"
}
function run_something {
echo "*** PID in run_something: $$"
sleep 10;
}
run_in_background
echo "PID of run in background $!"
Isso gera o seguinte:
PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background 5329
O que eu quero é a linha que começa com ****
a saída do PID do subshell, no caso do exemplo que seria 5329.
fonte
$(exec sh -c 'echo $PPID')
No entanto, o comando simples inicialsh -c 'echo $PPID'
fornece um terceiro PID. Então, obrigado pela solução. Aceitaram.(sh -c 'echo $PPID')
para evitar a criação de um subshell. Contraste com(sh -c 'echo $PPID'; true)
. Essa otimização só entra em ação se você tentar acessar$BASHPID
como a última coisa antes que o subshell saia, ou seja, apenas nos casos em que você não pode fazer nada com o valor. Portanto, na prática, você pode substituir$BASHPID
por$(sh -c 'echo $PPID')
.sh -c 'echo $PPID'
.Você pode conseguir o que deseja, mas precisa colocar run_something em um script separado. Não sei exatamente por que, mas $$ não é reavaliado quando usado em uma função no mesmo script que está sendo chamado. Eu acho que o valor de $$ é atribuído uma vez depois que o script é analisado e antes de ser executado.
run_in_background.sh
run_something.sh
resultado
fonte
fonte
if [[ ${!KSH_VERSION} = .sh.version ]]; then
(apenas um=
) eelif [[ -z ${BASHPID+_} ]]; then
(evite usar o implícito-n
entre colchetes duplos, o pdksh antigo não sabia disso).Seguindo a resposta de @Gilles que encontrei enquanto resolvia outro problema que tive, criei um programa de teste rápido que sustenta a teoria de que a resposta correta é:
Descobri que há momentos em que
exec
não é necessário, mas confirmei que usá-lo é a única maneira de obter o pid correto o tempo todo em todas as conchas que tentei. Aqui está o meu teste:e sua saída
Substitua seu shell favorito no shebang:
sh
,bash
,mksh
,ksh
, etc ...Não entendo por que os casos 2 e 3 apresentam resultados diferentes, nem por que os resultados do caso 3 diferem entre as conchas. Eu tentei
bash
,ksh
emksh
no Arch Linux FWIW.fonte
fonte