두 가지 기능이 포함된 스크립트가 있습니다. 함수는 다른 함수를 백그라운드 프로세스로 시작하고 해당 프로세스의 UID를 반환합니다. PID를 개인 변수에 넣지 않으려는 한 이것은 잘 작동합니다. PID를 변수에 할당하려고 하면 백그라운드 작업이 완료될 때까지 스크립트가 정지됩니다.
이 동작은 다음 스크립트를 사용하여 시연할 수 있습니다.
#!/bin/sh
foo () {
bar & # start bar in background
echo $! # return bars' PID
}
bar () {
sleep 5 # some background operation
}
FOO=$(foo) # remember the PID of bar
echo $FOO # expectation: should echo immediately
# reality: echo after five seconds
bar
그래서 제 질문은: 함수를 시작한 후 bar
반환을 기다리지 않고 스크립트가 계속 실행되도록 하려면 어떻게 해야 합니까 ?
답변1
메인 쉘이 명령 대체가 더 이상의 입력을 캡처하지 않는다는 것을 알 수 있도록 이 서브쉘에 의해 시작된 서브쉘은 $(foo)
완전히 종료되어야 합니다(모든 백그라운드 프로세스도 포함). 결국, bar
자고 난 후에 뭔가를 출력할 수 있습니다.
그러나 출력을 bar
다음으로 리디렉션할 수 있습니다 /dev/null
.
foo () {
bar > /dev/null &
echo "$!"
}
또는 (Bash 또는 ksh에서) 명령 대체를 취소하고 bar
기본 셸에서 실행합니다.
foo() {
typeset -n _pid=$1
bar &
_pid=$!
}
foo FOO
echo "$FOO"
eval
(또는 표준과 동일합니다 sh
.)