백그라운드에서 명령을 실행한 후 BASH 함수의 값을 에코합니다.

백그라운드에서 명령을 실행한 후 BASH 함수의 값을 에코합니다.

다른 것에 대한 테스트로 다음 명령을 실행하려고 합니다.

function echo_test {
  sleep 60 & > /dev/null
  returnpid=$!
  echo $returnpid
}

pidthatwasreturned=$(echo_test)

echo "This was the value that was returned by the function:"
echo $pidthatwasreturned

문제는 백그라운드에서 실행 중임에도 불구하고 sleep이 완료될 때까지 함수가 종료되고 반환되지 않는다는 것입니다. 제가 개발 중인 스크립트에서는 sleep 명령이 장기 실행 명령으로 효과적으로 대체됩니다. 이 함수를 재정의하여 즉시 반환되도록 하는 방법이 있습니까?

답변1

함수는 종료되지만 쉘은 pipe함수 내에서 함수를 읽는 코드를 설정 stdout하고 그 결과를 변수에 넣습니다 pidthatwasreturned.

그러나 파일 설명자는 stdout이 명령에 의해 60초 동안 sleep열린 상태로 유지됩니다 .

함수는 echo 명령의 출력을 리디렉션하지만 해당 sleep명령은 리디렉션하지 않으므로 변수 할당은 stdoutfrom sleep이 닫힐 때까지 기다립니다.

&와 를 바꾸면 > /dev/null에서 잘 작동 하고 에 버그가 없는 한 에서도 Bourne Shell잘 작동해야 합니다 .bashbash

관련 정보