서브쉘의 pid를 얻는 방법은 무엇입니까?

서브쉘의 pid를 얻는 방법은 무엇입니까?

서브쉘의 pid를 얻는 방법은 무엇입니까?

예를 들어:

$ echo $$
16808

원래 쉘이 확장되기 때문에 작동하지 않습니다 $$.

$ ( echo $$ )
16808

작은따옴표가 작동하지 않는 이유는 무엇입니까? 원래 셸에서 작은따옴표를 제거한 후 하위 셸 $$자체가 확장되지 않습니까?

$ ( echo '$$' )
$$

eval작동하지 않습니까? eval서브쉘에 의해 실행 되나요 ? 원래 쉘의 PID를 제공하는 이유는 무엇입니까?

$ ( eval echo '$$' )
16808

감사해요.

답변1

$ echo $BASHPID
37152
$ ( echo $BASHPID )
18633

매뉴얼에서:

BASHPID

현재 bash 프로세스의 프로세스 ID로 확장됩니다. 이는 $$bash를 다시 초기화할 필요가 없는 서브셸과 같은 경우와 다릅니다.

$

셸의 프로세스 ID로 확장됩니다. 서브쉘 에서는 ()서브쉘이 아닌 현재 쉘의 프로세스 ID로 확장됩니다.

관련된:

답변2

bashs 외에도 다음을 $BASHPID사용하여 포팅할 수 있습니다.

pid=$(exec sh -c 'echo "$PPID"')

예:

(pid=$(exec sh -c 'echo "$PPID"'); echo "$$ $pid")

이것을 함수로 바꿀 수 있습니다:

# usage getpid [varname]
getpid(){
    pid=$(exec sh -c 'echo "$PPID"')
    test "$1" && eval "$1=\$pid"
}

일부 쉘(예: zsh또는 ksh93)은 를 사용하여 생성된 모든 하위 쉘에 대해 하위 프로세스를 시작하지 않습니다 (...). 이 경우 와 동일하게 될 수 있습니다. 이는 호출 프로세스의 PID $pid이므로 맞습니다 .$$getpid

답변3

Linux에서 새 프로세스를 생성하지 않는 크로스 셸 솔루션(최소한 dash, bash, zsh)은 다음과 같습니다.

read -r this_pid < /proc/self/stat; echo ${this_pid%% *}

적어도 bash와 zsh에서는 읽기 구분 기호로 공백을 사용할 수도 있습니다.

read -d ' ' this_pid < /proc/self/stat ; echo $this_pid

당신은 또한 볼 수 있습니다사람 5 프로세스 /proc/[pid]/stat 섹션

답변4

원래의 "왜" 질문에 대답하려면 $$서브쉘 pid로 확장하거나 느리게 평가하는 것이 어떨까요 eval?

인용하다POSIX 문서:

$

호출 쉘의 10진수 프로세스 ID로 확장됩니다. 하위 셸(셸 실행 환경 참조)에서 "$"는 현재 셸과 동일한 값으로 확장되어야 합니다.

관련 정보