![zsh는 작업이 완료될 때까지 기다립니다.](https://linux55.com/image/72291/zsh%EB%8A%94%20%EC%9E%91%EC%97%85%EC%9D%B4%20%EC%99%84%EB%A3%8C%EB%90%A0%20%EB%95%8C%EA%B9%8C%EC%A7%80%20%EA%B8%B0%EB%8B%A4%EB%A6%BD%EB%8B%88%EB%8B%A4..png)
zsh를 실행하는 터미널에 다음을 입력하면 (각 줄은 명령입니다)
babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &
while [[ $(jobs) =~ 'babel' ]]; do echo 'moo'; done
약 3초간 소리가 나다가 멈춥니다. 하지만 파일에 동일한 코드를 넣으면moo.zsh그런 다음 내 터미널에서 실행하십시오.
zsh moo.zsh
1초도 안 되는 시간 안에 완료되며, 소리가 전혀 나지 않습니다. 왜 이런 일이 발생합니까?
답변1
비대화형 셸에서는 전체 작업 제어가 없습니다. jobs
명령 대체를 시작하면 하위 쉘에서 실행됩니다. 이 서브셸에는 실행 중인 작업이 없으며 아무것도 없습니다.
대화형 셸에서는모니터가 설정되었습니다, 작업을 완벽하게 제어할 수 있습니다. 이 경우 zsh
서브쉘에 진입하면 모든 작업이 테이블에 저장되며, 서브쉘에 작업이 없으면 작업 테이블이 사용됩니다.
4.3 이상에서는 zsh
shebang 줄을 배치하여 비대화형 셸에서 작업 제어를 켤 수 있습니다.-m
#!/usr/bin/zsh -m
또는 다음을 사용하십시오 setopt
.
setopt monitor
: The rest of script goes here
작업 상태를 확인하는 더 좋은 방법은 다음과 같습니다.
#!/usr/bin/zsh
zmodload zsh/parameter
babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &
while (( ${#jobstates} )); do
print "moo"
done
어쨌든 모든 하위 프로세스에 대해 내장 대기를 사용할 수 있습니다.기다리다:
babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &
# Wait for all children
wait
echo END