파이프와 무한 스트림은 어떻게 작동하나요?

파이프와 무한 스트림은 어떻게 작동하나요?

저는 주로 command1 | command2 | command3리눅스에서 많이 사용하는데 대부분은 확실한 내용을 다루고 있습니다.

cat | sed '' | sed ''무한 스트림을 시뮬레이션하는 무한 스트림 으로 이것을 시도했을 때 Ctrl-D. 사용하여 문제를 해결할 수 있지만 cat | sed -e '' -e ''첫 번째 문제가 작동하지 않는 이유를 알고 싶습니다. cat | cat | cat잘 작동합니다. 와 관련이 있습니까 sed? 그렇다면 그 문제는 무엇입니까?

나는 이 문제에 대해 생각하려고 노력했고 내가 발견한 유일한 차이점은 내가 사용할 때 위의 첫 번째 키에서는 발생하지 않는 특별한 작업을 수행하는 키를 cat눌렀다는 것입니다.Entersed ''

무한 증기로 파이프 작업을 원활하게 만드는 방법을 알려주실 수 있나요?

답변1

파이프는 출력 또는 왼쪽 명령을 오른쪽 명령의 입력에 연결합니다. 이는 스트림의 길이와 관련이 없습니다. 그러나 파이프라인의 각 명령에는 여전히 자체 버퍼링 규칙이 있습니다. 각 명령에서 이를 트리거하지 않으면 최종 출력에 표시되지 않습니다.

답변2

기본적으로 다음과 같은 내용이 중복됩니다.SO에 대한 내 대답. 그런데 stdbuf여기서는 명령어를 언급하는 사람이 아무도 없어서 여기에도 추가해야겠다는 생각이 들었습니다.

===============

기본적으로 파이프에서 읽는 프로세스는 파이프에서 데이터를 사용할 수 있게 되자마자 바이트 단위로 데이터를 소비할 수 있습니다. 그러나 프로그램이 읽기, 쓰기 등과 같은 libc의 std io 기능을 사용하는 한 libc는 프로그램이 터미널에 쓰는지 여부에 따라 해당 프로그램의 입력/출력을 버퍼링합니다.

기본적으로 프로그램이 터미널에 쓰는 경우 libc는 출력 라인 방식으로 버퍼링하고, 터미널로 가지 않으면 블록 방식으로 버퍼링됩니다.

Linux에서는 glibc가 있으면 stdbuf다음과 같은 명령을 사용하여 해당 동작에 영향을 줄 수 있습니다.

stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''

저는 명령에 라인 기반 출력 버퍼를 사용하고 cat, 첫 번째 sed명령에 라인 기반 입력 및 출력 버퍼를, 마지막 sed명령에 라인 기반 입력 버퍼를 사용하고 있습니다.

답변3

-u버퍼링을 최소화하려면 sed 옵션을 사용할 수 있습니다 .

cat | sed -u '' | sed ''

관련 정보