$$
Bash 백그라운드 프로세스의 값에 대한 문서가 있나요?
man
$$
서브셸에 있는 기본 프로세스의 PID라고 주장합니다 .
다음 문서에 따르면 서브쉘은 중괄호를 통해 생성되지만 공식 서브쉘은 (...)
아닌 것으로 보입니다 .cmd &
https://tldp.org/LDP/abs/html/subshells.html
https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap03.html
답변1
~에서기준:
명령 대체, 괄호로 묶인 명령 및비동기 목록서브쉘 환경에서 실행되어야 합니다.
cmd &
는비동기 목록.
그리고 (논쟁을 위해) 그것이 다음과 같다고 가정하자 cmd &
.아니요서브쉘, 그러면 남은 유일한 것은기본쉘 환경에서는 $$
메인 프로세스의 PID가 동일합니다.-)
참고: Bash에서는 파이프라인의 모든 명령이 하위 셸에서도 실행됩니다. ksh와 같은 일부 다른 셸에서는 파이프라인의 마지막 명령이 기본 셸 환경에서 실행됩니다. 그러면 다음과 같은 합계 가 1
인쇄 됩니다 .bash
3
ksh
a=1; a=2 | a=3; echo $a
답변2
$$
문서에는 몇 가지 참조가 있습니다 man bash
.
특수 매개변수
$
셸의 프로세스 ID로 확장됩니다. 서브쉘 에서는()
서브쉘이 아닌 현재 쉘의 프로세스 ID로 확장됩니다.
쉘 변수
BASHPID
현재 bash 프로세스의 프로세스 ID로 확장됩니다. 이는$$
bash를 다시 초기화할 필요가 없는 서브셸과 같은 경우와 다릅니다.
명령 실행 환경
셸에는 다음 부분으로 구성된 실행 환경이 있습니다.
- [...]
- 백그라운드 작업의 프로세스 ID, 값
$$
및 프로세스 ID를 포함한 다양한 프로세스 IDPPID
$$
경험상 서브셸 내에서 구문은 동일하게 유지되지만 다음과 같이 변경되는 것을 볼 수 있습니다 $BASHPID
.
echo "$BASHPID - $$" # 23671 - 23671
( echo "$BASHPID - $$" ) # 41199 - 23671
true | ( echo "$BASHPID - $$" ) | cat # 41258 - 23671