Bash 파이프라인에서 "$$"가 변경되지 않는 이유는 무엇입니까? 하위 프로세스를 시작하지 않습니까?

Bash 파이프라인에서 "$$"가 변경되지 않는 이유는 무엇입니까? 하위 프로세스를 시작하지 않습니까?

다음 코드를 실행했습니다.

echo $$
# Output : 3911
true | while true; do
    eval 'echo $$'
    break
done
# Output : 3911

문서에 따르면 while 루프(파이프 포함)는 하위 프로세스에서 실행됩니다. 이 경우 두 프로세스 ID가 달라야 합니까?

답변1

서브쉘에서 in 값을 확인하더라도 $$해당 값은 변경되지 않습니다. bash이 동작은 다음으로 인해 발생합니다.POSIX 표준:

$

호출 쉘의 10진수 프로세스 ID로 확장됩니다. 서브쉘에서 [...]는 $현재 쉘과 동일한 값으로 확장되어야 합니다.

아마도 를 사용해야 할 것입니다 $BASHPID. 다음은 bash매뉴얼에서 발췌한 내용입니다.

BASHPID

현재 bash 프로세스의 프로세스 ID로 확장됩니다. 이는 $$bash를 다시 초기화할 필요가 없는 서브셸과 같은 경우와 다릅니다. 할당에는 BASHPID아무런 영향이 없습니다. 설정하지 않으면 BASHPID나중에 재설정하더라도 특수 속성이 손실됩니다.

대신 사용할 코드를 다시 작성하세요 $BASHPID.

printf '%s\n' "$BASHPID"
true | while true; do
    printf '%s\n' "$BASHPID"
    break
done

이 명령을 실행하면 두 개의 서로 다른 PID가 출력됩니다.

관련 정보