Aprenda a diferença entre $$ e $ Bashpid em Bash

Aprenda a diferença entre $$ e $ Bashpid em Bash

Recentemente, eu estava trabalhando em um script de shell e vi uma diferença significativa em como bash variável especial $ e Bashpid se comporta. Todo processo em execução no Linux será atribuído com um processo EU IA E é assim que o sistema operacional lida com o processo.

Leitura relacionada: Aprenda a diferença entre o fornecimento e a bifurcação em Bash

Da mesma forma, sua sessão de terminal Bash também será atribuída com um ID do processo. Existe uma variável especial chamada "$" e "$ Bashpid" que armazena o ID do processo do shell atual.

Vá em frente e execute o comando abaixo para ver qual é o ID do processo do seu shell atual. Ambos "$" e "$ Bashpid" vai devolver o mesmo valor.

$ echo $$ # impressão variável especial $ $ echo $ Bashpid # Imprimindo o varibale $ Bashpid 
Encontre ID do processo de shell atual

Em Bash, quando chamamos qualquer programa externo do shell, ele criará um processo/subshell infantil e o programa será enviado apenas no processo filho. Veja o exemplo abaixo, onde coloquei um comando simples de monitor de processo em um script chamado "amostra.sh ” para demonstrar como o shell pai cria uma subshell para executar o programa.

#!/usr/bin/Env Bash PS -EF -Forest | Grep -i Bash 

Agora, na execução deste script, podemos obter o ID do processo do Bash. A partir da imagem abaixo, você pode entender quando liguei para o script Bash cria um processo infantil e execute o script.

$ ./amostra.sh 
Processo infantil Linux

Agora vamos usar os dois "$" e "$ Bashpid" dentro do script e veja o que ele retorna.

#!/usr/bin/Env Bash Echo "============================" PS -EF -Forest | Grep -i Bash Echo "=============================" Echo "PID usando $ para script $ 0 ==> $$" ECHO " "PID usando o Bashpid para Script $ 0 ==> $ Bashpid" Echo 

Agora execute o script novamente.

$ ./amostra.sh 
PID de processo infantil

Tudo bem, ele retorna o mesmo ID do processo. Aqui vem a diferença real. Vamos criar outro processo infantil dentro do script executando um comando dentro parênteses().

# Armazenando o PID em uma variável… var_hash = $ (echo $$) var_bashpid = $ (echo $ Bashpid) echo "valor de var_hash ==> $ var_hash" echo "valor de var_bashpid ==> var_bashpid" 
Diferença no PID

Em Bash, Parênteses invocará um processo infantil e executará o que vier dentro dos parênteses. Nesse caso, ambos $ e $ Bashpid deve armazenar um novo ID do processo infantil. Mas pela imagem acima, você pode ver que há uma diferença onde $ lojas 382 Qual é o ID pai (ID do processo do script amostra.sh), e $ Bashpid Armazena o ID do processo infantil criado criado por parênteses.

Agora vamos tentar entender esse comportamento. Veremos o que a página do homem diz.

$ MAN BASH 
Página de homem por $ Página do homem para Bashpid

Quando você usa $, Mesmo em uma subshell, ele armazena o ID do processo do processo pai que foi criado. Mas Bashpid armazenará o ID do processo atual, eu.e quando chamado interna parênteses, ele armazenará o ID do processo filho.

Não podemos atribuir ou modificar a variável $, mas Bashpid pode ser transferido, mas não tem efeito.

$ $ = 10 $ BASHPID = 10 $ ECHO $ ​​BASHPID 
Atribuição variável de bash

É possível desmaiar Bashpid. Quando você não se sente, perde seu estado especial e também pode começar a usar isso como uma variável normal.

$ unset Bashpid $ echo $ Bashpid $ Bashpid = "Tecmint" $ ECHO $ ​​BASHPID 
Unset Bashpid

Mesmo se você tentar atribuir o ID do processo do shell, ele será tratado como uma variável definida pelo usuário, pois já perdeu seu estado especial.

$ Bashpid = $ (echo $$) $ echo $$; echo $ Bashpid 
Reatribuindo Bashpid

Nesse caso, você deve usar uma nova sessão de terminal para Bashpid Para conseguir seu estado especial.

É isso para este artigo. Vimos a diferença entre $ e Bashpid e como eles se comportam neste artigo. Passe por este artigo e compartilhe seu valioso feedback conosco.