![일시 중지된 후 while 루프가 중지되는 이유는 무엇입니까?](https://linux55.com/image/78245/%EC%9D%BC%EC%8B%9C%20%EC%A4%91%EC%A7%80%EB%90%9C%20%ED%9B%84%20while%20%EB%A3%A8%ED%94%84%EA%B0%80%20%EC%A4%91%EC%A7%80%EB%90%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
bash를 사용하고 while 루프를 일시 중지한 다음 재개 후 루프가 중지되는 이유는 무엇입니까? 아래의 간단한 예입니다.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
나는 신호에 대해 잘 알고 있으며 이것이 bash의 자연스러운 동작일 것이라고 추측합니다. 그러나 왜 이것이 특정한 방식으로 동작하는지 더 잘 이해하고 싶습니다.
답변1
이것은 여러 쉘의 버그처럼 보이지만 예상대로 작동합니다.크쉬 93그리고다루기 힘든.
배경:
대부분의 쉘은 메인 쉘 내에서 while 루프를 실행하는 것으로 보입니다.
본 쉘비로그인 쉘을 사용하여 ^Z를 입력하면 전체 쉘이 중단됩니다.
세게 때리다잠시 멈추고 sleep
while 루프를 그대로 두고 대신 새 쉘 프롬프트를 인쇄하십시오.
스프린트명령을 일시 중지할 수 없도록 설정
그리고크쉬 93, 상황이 매우 다르게 작동합니다.
크쉬 93명령을 처음 실행하면 동일한 작업을 수행하지만 sleep
ksh93의 내장 기능과 마찬가지로 ksh93에는 while 루프가 기본 셸을 분기한 다음 ^Z 상승을 입력하면 정지되는 핸들러가 있습니다.
당신이있는 경우크쉬 93나중에 입력하면 fg
여전히 루프를 실행 중인 분기된 하위 프로세스가 계속됩니다.
bash와 ksh93의 작업 제어 메시지를 비교할 때 주요 차이점을 알 수 있습니다.
세게 때리다보고서:
[1]+ Stopped sleep 1
하지만크쉬 93보고서:
^Z[1] + Stopped while true; do echo .; sleep 1; done
다루기 힘든다음과 유사한 동작크쉬 93
두 셸 모두 ^Z를 입력하지 않는 한 하나의 프로세스(기본 셸)가 있고 ^Z를 입력한 후에는 두 개의 셸 프로세스가 있습니다.
답변2
나는 이 문제를 논의하기 위해 Bash의 공동 저자 중 한 명에게 편지를 썼고 그의 답변은 다음과 같습니다.
이는 실제로 오류는 아니지만 경고 역할을 합니다.
여기서의 아이디어는 셸 명령과 다른 세분성 단위인 프로세스를 일시 중지하는 것입니다. 프로세스가 일시 중지되면 쉘로 돌아가고(0이 아닌 상태로, 이는 루프가 테스트 중인 프로세스를 중지할 때 결과가 발생함) 선택 사항이 있습니다. 중지된 프로세스를 떠나 루프를 중단하거나 계속할 수 있습니다. 뒤에 . Bash는 작업이 중지되면 루프에서 벗어나도록 선택합니다(그리고 항상 선택합니다). 주기를 계속하는 것이 원하는 경우는 거의 없습니다.
일부 다른 셸은 셸 복사본을 포크하고 SIGTSTP에 의해 일시 중지되면 프로세스를 중지하는 등의 작업을 수행합니다. Bash는 이 작업을 수행한 적이 없습니다. 혜택 보장보다 더 복잡해 보입니다. 그러나 누구든지 이 코드를 패치로 제출하려는 경우 변경 사항 병합을 고려할 것입니다.
따라서 패치를 제출하려는 사람이 있으면 매뉴얼 페이지에 있는 이메일 주소를 사용하십시오.