Aprenda a diferença entre $$e $BASHPID no Bash
Recentemente, eu estava trabalhando em um script de shell e vi uma diferença significativa em como as variáveis especiais do bash $
e BASHPID
se comportam. Cada processo em execução no Linux receberá um ID de processo e é assim que o sistema operacional lida com o processo.
Da mesma forma, sua sessão de terminal bash também receberá um ID de 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. Tanto "$"
quanto "$BASHPID"
retornarão o mesmo valor.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
No bash, quando chamamos qualquer programa externo do shell, ele criará um processo/subshell filho 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 “sample.sh” para demonstrar como o shell pai cria um subshell para executar o programa.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Agora, ao executar este script, podemos obter o ID do processo bash. Pela imagem abaixo, você pode entender quando chamei o script bash, criei um processo filho e executei o script.
./sample.sh
Agora vamos usar "$"
e "$BASHPID"
dentro do script e ver o que ele retorna.
#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo
Agora execute o script novamente.
./sample.sh
Tudo bem, ele retorna o mesmo ID do processo. Aí vem a diferença real. Vamos criar outro processo filho dentro do script executando um comando dentro de parênteses()
.
STORING THE PID INTO A VARIABLE…
VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)
echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"
No bash, Parentheses invocará um processo filho e executará tudo o que estiver entre parênteses. Nesse caso, $
e $BASHPID
devem armazenar um novo ID de processo filho. Mas pela imagem acima, você pode ver que há uma diferença onde $
armazena 382 que é o ID pai (ID do processo do script sample.sh) e $BASHPID
armazena o ID do processo filho criado entre parênteses.
Agora vamos tentar entender esse comportamento. Veremos o que a página de manual diz.
man bash
Quando você usa $
, mesmo em um subshell, ele armazena o ID do processo pai a partir do qual foi criado. Mas BASHPID
armazenará o ID do processo atual, ou seja, quando chamado entre parênteses, armazenará o ID do processo filho.
Não podemos atribuir ou modificar a variável $
, mas BASHPID
pode ser reatribuído, mas não tem efeito.
$=10
BASHPID=10
echo $BASHPID
É possível desabilitar BASHPID. Quando você desativa, ele perde seu estado especial e você também pode começar a usar isso como uma variável normal.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $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
Neste caso, você deve usar uma nova sessão de terminal para BASHPID para obter seu estado especial.
É isso neste artigo. Vimos a diferença entre $
e BASHPID
e como eles se comportam neste artigo. Leia este artigo e compartilhe seus valiosos comentários conosco.