파이프 라인에서 데이터가 어떻게 흐르는 지 이해하지 못하고 누군가가 무슨 일이 일어나고 있는지 명확히 할 수 있기를 바랍니다.
명령 파이프 라인이 파일 (텍스트, 문자열 배열)을 한 줄씩 처리한다고 생각했습니다. (각 명령 자체가 한 줄씩 작동하는 경우) 각 텍스트 행이 파이프 라인을 통과하면 명령은 이전 입력이 전체 입력 처리를 완료 할 때까지 기다리지 않습니다.
그러나 그렇지 않은 것 같습니다.
다음은 테스트 예입니다. 몇 줄의 텍스트가 있습니다. 나는 대문자로 각 줄을 두 번 반복합니다. 나는 그렇게한다 cat text | tr '[:lower:]' '[:upper:]' | sed 'p'
.
프로세스를 따르기 위해 "대화식으로"실행할 수 있습니다 cat
. 에서 입력 파일 이름을 건너 뛰십시오 . 파이프 라인의 각 부분은 한 줄씩 실행됩니다.
$ cat | tr '[:lower:]' '[:upper:]'
alkjsd
ALKJSD
sdkj
SDKJ
$ cat | sed 'p'
line1
line1
line1
line 2
line 2
line 2
그러나 완전한 파이프 라인은 입력을 마치고 EOF
결과를 인쇄 할 때까지 기다립니다 .
$ cat | tr '[:lower:]' '[:upper:]' | sed 'p'
I am writing...
keep writing...
now ctrl-D
I AM WRITING...
I AM WRITING...
KEEP WRITING...
KEEP WRITING...
NOW CTRL-D
NOW CTRL-D
그렇게되어 있습니까? 왜 한 줄씩 표시되지 않습니까?
tr
과 sed
에서 공정 라인을 cat
stdin을 닫히기 전에
cat
stdin이 닫힐 때까지 버퍼링됩니다.