무한정 출력하려는 ​​명령이 특정 양의 입력을 기다리는 다른 명령으로 파이프될 때 종료 시점을 어떻게 알 수 있습니까?

무한정 출력하려는 ​​명령이 특정 양의 입력을 기다리는 다른 명령으로 파이프될 때 종료 시점을 어떻게 알 수 있습니까?

Bash에서 파이프가 어떻게 작동하는지 혼란스러워요. 무작위 문자열 생성기를 예로 들어 보겠습니다.

tr -dc 'A-Z0-9' </dev/urandom

생성된 tr프로세스는 다음을 읽습니다./dev/urandom무기한/dev/urandom무언가가 방해할 때까지 출력을 제공합니다. 이제 이것을 받아보세요:

tr -dc 'A-Z0-9' </dev/urandom | fold -w 8 | head -n 1

겉으로는 불확실해 보이는 대문자 영숫자의 첫 번째 줄을 즉시 출력합니다. 각 줄은 8개의 기호로 축소됩니다. 즉, 무작위로 8개의 대문자 영숫자가 생성됩니다. 관점에서 볼 때 예감이 듭니다 head. 첫 번째 행을 기다리고 그 이후로 기다리는 유일한 것입니다.표준 입력.

man bash설명하다:

파이프라인의 각 명령은 별도의 프로세스(즉, 하위 셸에서)로 실행됩니다.

도대체 어떻게 이것으로 충분하다고 headfold합니까 tr? fold프로세스에 종료 신호를 보내시겠습니까 tr? 또는 head다음 과 같은 좀 더 복잡한 행동을 할 수도 있습니다./dev/표준 입력fold와 같은 스트림을 가리킨다 ./dev/표준 출력head, 스트림을 닫을 때 fold종료 신호를 받습니까? 이러한 서브쉘이 이와 같은 파이프에 쌓이면 어떻게 될까요?

그리고 부가 질문: 파이프에 쌓였을 때 제대로 작동하려면 bash 스크립트를 어떻게 작성해야 합니까?

관련 정보