왜 $! 백그라운드에서 실행 중인 서브셸에 대해 잘못된 프로세스 ID를 반환합니까?

왜 $! 백그라운드에서 실행 중인 서브셸에 대해 잘못된 프로세스 ID를 반환합니까?
$(sleep 5) &
echo $!
sleep 1
echo "done"

위의 출력은 다음과 같습니다.

$ ./test.sh
7483
done

그러나 검색해 보면 sleep다음 ps aux과 같습니다.

 ps aux | rg sleep
chris     7484  0.0  0.0 132788  1432 pts/6    S+   12:10   0:00 sleep 1
chris     7485  0.0  0.0 132788  1432 pts/6    S+   12:10   0:00 sleep 5
chris     7519  0.0  0.0  10376  5744 pts/7    S+   12:10   0:00 rg --no-ignore-vcs sleep

sleep 5 프로세스는 7485스크립트 의 출력이 아닙니다 7483. 이 행동의 이유는 무엇입니까?

답변1

$(sleep 5)

실행 중인 쉘을 실행하십시오 sleep. 주어진 pid는 $!쉘의 pid입니다.

여기서는 굳이 바꾸실 필요가 없습니다.

 sleep 5 &

sleep당신에게 pid를 줄 것입니다 .

sleep귀하의 예에서는 다른 것이 대체되었다고 생각 하지만, 그럼에도 불구하고 배경 교체는 아마도 불필요할 것입니다. 서브쉘만 사용하세요.

(sleep 5) &

sleeppid는 일반적 으로 서브쉘에서 마지막 명령을 실행할 때 많은 쉘이 하위 명령으로 대체되기 때문에 제공됩니다 . 이는 하위 쉘의 pid를 효과적으로 재사용합니다 sleep.

(sleep 5; sleep 5) &

대신 쉘의 pid를 알려줄 것입니다 sleep.

관련 정보