다음 코드를 실행했습니다.
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가 출력됩니다.