Pesquisa de site

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.