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
설명하다:
파이프라인의 각 명령은 별도의 프로세스(즉, 하위 셸에서)로 실행됩니다.
도대체 어떻게 이것으로 충분하다고 head
말 fold
합니까 tr
? fold
프로세스에 종료 신호를 보내시겠습니까 tr
? 또는 head
다음 과 같은 좀 더 복잡한 행동을 할 수도 있습니다./dev/표준 입력fold
와 같은 스트림을 가리킨다 ./dev/표준 출력head
, 스트림을 닫을 때 fold
종료 신호를 받습니까? 이러한 서브쉘이 이와 같은 파이프에 쌓이면 어떻게 될까요?
그리고 부가 질문: 파이프에 쌓였을 때 제대로 작동하려면 bash 스크립트를 어떻게 작성해야 합니까?