![서브쉘의 pid를 얻는 방법은 무엇입니까?](https://linux55.com/image/142733/%EC%84%9C%EB%B8%8C%EC%89%98%EC%9D%98%20pid%EB%A5%BC%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
서브쉘의 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
bash
s 외에도 다음을 $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로 확장됩니다. 하위 셸(셸 실행 환경 참조)에서 "$"는 현재 셸과 동일한 값으로 확장되어야 합니다.