웹사이트 검색

Bash에서 $$와 $BASHPID의 차이점 알아보기


최근에 저는 쉘 스크립트 작업을 하다가 bash 특수 변수 $BASHPID가 작동하는 방식에 상당한 차이가 있음을 확인했습니다. Linux에서 실행되는 모든 프로세스에는 프로세스 ID가 할당되며 이것이 운영 체제가 프로세스를 처리하는 방식입니다.

마찬가지로 bash 터미널 세션에도 프로세스 ID가 할당됩니다. 현재 쉘의 프로세스 ID를 저장하는 "$""$BASHPID"라는 특수 변수가 있습니다.

아래 명령을 실행하여 현재 셸의 프로세스 ID가 무엇인지 확인하세요. "$""$BASHPID"는 모두 동일한 값을 반환합니다.

echo $$               # Printing special variable $
echo $BASHPID         # Printing the varibale $BASHPID

bash에서는 쉘에서 외부 프로그램을 호출하면 하위 프로세스/하위 쉘이 생성되고 프로그램은 하위 프로세스에만 제출됩니다. “sample.sh”라는 스크립트에 간단한 프로세스 모니터 명령을 입력하여 상위 셸이 프로그램을 실행하기 위해 하위 셸을 생성하는 방법을 보여주는 아래 예를 참조하세요.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

이제 이 스크립트를 실행하면 bash의 프로세스 ID를 얻을 수 있습니다. 아래 이미지를 보면 bash 스크립트를 호출하면 자식 프로세스가 생성되고 스크립트가 실행되는 것을 알 수 있습니다.

./sample.sh

이제 스크립트 내에서 "$""$BASHPID"를 모두 사용하고 반환되는 내용을 살펴보겠습니다.

#!/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

이제 스크립트를 다시 실행해 보세요.

./sample.sh

좋습니다. 동일한 프로세스 ID를 반환합니다. 여기에 실제 차이점이 있습니다. parentheses() 안에 명령을 실행하여 스크립트 내에 또 다른 하위 프로세스를 생성해 보겠습니다.

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"

Bash에서 괄호는 하위 프로세스를 호출하고 괄호 안에 있는 모든 항목을 실행합니다. 이 경우 $$BASHPID는 모두 새로운 하위 프로세스 ID를 저장해야 합니다. 하지만 위 이미지를 보면 $가 상위 ID인 382를 저장하고 있다는 점에서 차이가 있음을 알 수 있습니다(sample.sh 스크립트의 프로세스 ID). ), $BASHPID는 생성된 하위 프로세스 ID를 괄호로 묶어 저장합니다.

이제 이 동작을 이해해 보도록 하겠습니다. 우리는 매뉴얼 페이지에 뭐라고 쓰여 있는지 살펴보겠습니다.

man bash

$를 사용하면 서브셸에서도 생성된 상위 프로세스의 프로세스 ID를 저장합니다. 그러나 BASHPID는 현재 프로세스 ID를 저장합니다. 즉, 괄호 안에서 호출하면 하위 프로세스 ID가 저장됩니다.

$ 변수는 할당하거나 수정할 수 없지만 BASHPID는 재할당할 수 있지만 아무런 효과가 없습니다.

$=10
BASHPID=10
echo $BASHPID

BASHPID를 설정 해제할 수 있습니다. 설정을 해제하면 특수 상태가 사라지고 이를 일반 변수로 사용할 수도 있습니다.

unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID

쉘의 프로세스 ID를 할당하려고 해도 이미 특수 상태가 손실되었기 때문에 사용자 정의 변수로 처리됩니다.

BASHPID=$(echo $$)
echo $$;echo $BASHPID

이 경우 특수 상태를 얻으려면 BASHPID에 대한 새 터미널 세션을 사용해야 합니다.

이것이 바로 이 기사입니다. 이 기사에서는 $BASHPID의 차이점과 작동 방식을 살펴보았습니다. 이 기사를 검토하고 귀중한 피드백을 우리와 공유하십시오.