나는 이 예상치 못한 행동을 우연히 발견했고 더 잘 아는 사람이 그것을 설명할 수 있기를 바랍니다!
스크립트에 의해 호출되고 백그라운드 프로세스로 실행되는 함수가 있습니다. some_function &
이를 변수에 할당했을 때 xxx=$(some function &)
스크립트를 죽이면 프로세스도 죽는다는 것을 알았습니다. 그러나 스크립트를 종료하면 변수에 할당되지 않은 프로세스가 계속 실행됩니다!
왜 이런거야? 변수에 명령을 할당하면 스크립트에 연결할 수 있다고 생각했는데, 스크립트를 죽이면 그것도 죽게 될까요? 그것은 나에게 좋은 일입니다. 나는 그것을 이해하고 싶습니다. 함수 자체는 아무것도 반환하지 않습니다.
코드는 다음과 같습니다.
screen_saver_function () { while true; do echo "some phrase"; done }
yyy=$(cat /dev/$tty > /tmp/tty &)
xxx=$(screen_saver_function > /dev/$tty &)
while true; do [[ ! -z $(cat /dev/$tty) ]] && break; done
아이디어는 screen_saver_function의 출력을 터미널(첫 번째 줄)로 파이프한 다음 키를 누르면 종료된다는 것입니다. 터미널의 텍스트를 파일에 쓰고 해당 텍스트가 파일에 나타날 때 스크립트를 종료하면 됩니다. 나는 그것이 형편 없다는 것을 알고 있지만 작동합니다. 나는 $를 잡는다! 설명된 이상한 동작이 발생하면 해당 동작을 종료하여 백그라운드 프로세스를 종료합니다.
답변1
에서는 xxx=$(some function &)
그렇습니다. 해당 하위 쉘에서 비동기적으로 실행되고 있지만 some function
표준 출력은 여전히 명령 대체에 의해 생성된 파이프의 쓰기 끝에 연결되어 있습니다.
따라서 하위 쉘은 비동기식으로 시작된 후 즉시 종료되지만 some function
파이프의 읽기 끝에서 명령 대체의 출력을 읽어 변수를 채우는 상위 쉘은 여전히 $xxx
해당 파이프의 파일 끝을 기다립니다. some function
완료되기 전에 발생합니다.
상위 셸이 종료되면 파이프의 읽기 끝이 닫히고 some function
다음 번에 stdout(파이프에)에 쓰려는 시도는 SIGPIPE를 받게 됩니다.