배경 서브쉘을 제어하는 ​​방법은 무엇입니까?

배경 서브쉘을 제어하는 ​​방법은 무엇입니까?

Bash 프롬프트에서 다음 명령을 실행하면:

(for i in {1..100}; do echo $i; sleep 1; done) &

계산이 시작되고 즉시 프롬프트로 돌아갑니다. 계속해서 잘 작업할 수 있지만 매초마다 내가 작업 중인 항목 위에 새로운 숫자가 인쇄됩니다. 작업을 볼 수 jobs있거나 예상대로 작동합니다 fg.kill

이제 이 명령을 다음 스크립트로 옮기면 다음과 같습니다 test.sh.

#!/usr/bin/bash
(for i in {1..100}; do echo $i; sleep 1; done) &

을 실행하면 ./test.sh같은 일이 발생하지만 작업이 더 이상 오지 jobs않고 더 이상 할 수 없습니다 fg. 두 번째 동작이 첫 번째 동작과 정확히 다른 이유는 무엇이며, PID를 찾아서 종료하지 않고 두 번째 작업을 어떻게 제어할 수 있습니까?

답변1

$!이 목적을 위해서만 설정된 PID를 추적해야 합니다 . 예를 들어,

#!/usr/bin/bash

(sleep 30; echo "slept for 30 seconds") &
sleeping_pid=$!
# do something
kill $sleeping_pid # or you can wait on it, or...

이는 $!가장 최근에 시작된 백그라운드 작업입니다. 따라서 재정의되는 경향이 있으므로 즉시 다른 변수에 복사합니다.

답변2

test.sh제 경우에는 하위 쉘을 그룹 명령으로 변경하여 목표를 달성 할 수 있었습니다 .

(for i in {1..100}; do echo $i; sleep 1; done) &

~이 되다

{ for i in {1..100}; do echo $i; sleep 1; done; } &

그러면 모든 작업 제어 기능을 사용할 수 있습니다. 다행스럽게도 내 목적에 따라 하위 쉘 및 그룹 명령은 기본적으로 동일하지만 모든 사람에게 적합하지 않을 수 있습니다.

관련 정보