서브쉘에서 실행하는 것과 coproc 명령과 함께 &를 사용하는 것의 차이점은 무엇입니까?

서브쉘에서 실행하는 것과 coproc 명령과 함께 &를 사용하는 것의 차이점은 무엇입니까?

나는 최근에 리눅스의 서브쉘에 관해 읽었습니다. 사용된 예는 sleep 10입니다.

(sleep 10)  -  subshell
sleep 10&   - background process
coproc sleep 10  

기록상 첫 번째 명령은 서브셸에서 실행됩니다. 두 번째는 서브쉘을 포함하지 않는 백그라운드 프로세스입니다. 세 번째는 이 둘의 결합이다. 을 사용하여 테스트했는데 ps -ef, 이 모든 명령은 서브쉘 생성을 보여줍니다. &와 서브쉘을 사용하는 백그라운드 프로세스 사이에 차이점이 있나요? coproc도 같은 일을 하는 것 같습니다. 나는 완전히 혼란스러워요. 이 주제에 대한 명확한 설명을 주시면 감사하겠습니다.

답변1

sleep쉘의 내장이 아닌 쉘 에서 실행 되므로 어떤 경우에도 별도의 프로세스에서 실행되어야 합니다(이는 내장 ksh93또는 내장 mksh내에서 sleep다릅니다 ).

(sleep 10)깨달았다서브쉘 환경. 셸 환경(별칭, 변수, 함수, umask, 작업 디렉터리, 리디렉션...)에 대한 수정 사항은 셸 환경에만 영향을 미치고 (...)반환 시 손실된다는 개념입니다 .(...)

대부분의 셸에서는 하위 프로세스를 포크하여 이를 수행합니다. 모든 쉘이 이 작업을 수행하는 것은 아닙니다. ksh93대신, 이 경우 포크하지 않고 스택에 이전 환경 설정을 저장하고 종료 시 복원하십시오.

많은 쉘에서 최적화로 서브 쉘의 마지막 명령이 외부 명령이고 ( sleep귀하의 경우와 같이) 설정이 없으면 trap쉘은 프로세스를 실행하기 위해 포크하지 않고 서브 쉘에서 직접 실행합니다. 어쨌든 나중에 필요하지 않으므로 처리하십시오.

shells 의 경우 bash이는 해당 명령이 서브셸의 유일한 명령인 경우에만 발생합니다(이 역시 귀하의 경우입니다).

sleep 10&또한 coproc sleep 10서브셸 환경을 시작하지만 이러한 경우 병렬로 실행되는 두 개의 스레드가 있으므로 하위 프로세스를 사용하여 수행해야 합니다. 둘 사이의 차이점은 이 coproc경우 하위 쉘의 stdin 및 stdout이 상위 쉘과 상호 작용하기 위해 두 개의 파이프에 연결된다는 것입니다.

(...)예와 마찬가지로 하위 쉘이 하나의 명령으로만 구성된 경우 해당 명령은 쉘 프로세스에서 직접 실행됩니다.

차이점을 더 잘 확인하려면 다음과 같이 여러 명령을 실행하는 하위 쉘을 실행할 수 있습니다.

{ ps; echo done; } # no subshell
(ps; echo done)
{ ps; echo done; } &
coproc { ps; echo done; }

관련 정보