$(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) &
sleep
pid는 일반적 으로 서브쉘에서 마지막 명령을 실행할 때 많은 쉘이 하위 명령으로 대체되기 때문에 제공됩니다 . 이는 하위 쉘의 pid를 효과적으로 재사용합니다 sleep
.
(sleep 5; sleep 5) &
대신 쉘의 pid를 알려줄 것입니다 sleep
.