나는 일반적으로 command1 | command2 | command3
Linux에서 이것을 많이 사용하지만 대부분 결정론적인 내용을 처리합니다.
무한 스트림으로 이것을 시도하면 cat | sed '' | sed ''
(무한 스트림을 시뮬레이션하기 위해) Ctrl-D. 를 사용하여 문제를 해결할 수 있지만 cat | sed -e '' -e ''
첫 번째 것이 작동하지 않는 이유를 알고 싶습니다. cat | cat | cat
훌륭하게 작동합니다. 관련성이 있나요 sed
? 그렇다면 문제는 무엇인가요?
이것에 대해 생각하려고 노력했는데 유일하게 다른 점은 키를 사용할 때 cat
처음 Enter에는 발생하지 않았던 특별한 일이 발생했다는 것 입니다 sed ''
.
무한한 증기로 파이프를 원활하게 작동시키는 방법을 알려주실 수 있는 분 계십니까?
답변1
파이프는 왼쪽 명령의 출력을 오른쪽 명령의 입력에 연결합니다. 이는 스트림의 길이와 관련이 없습니다. 그러나 파이프라인의 각 명령에는 여전히 자체 버퍼링 규칙이 있습니다. 모든 명령에서 이를 트리거하지 않으면 최종 출력에 표시되지 않습니다.
답변2
이것은 기본적으로SO에 대한 나의 대답. 그런데 stdbuf
여기에서는 이 명령을 언급한 사람이 아무도 없어서 여기에도 추가해야겠다는 생각이 들었습니다.
===============
기본적으로 파이프에서 데이터를 사용할 수 있는 한 파이프에서 읽는 프로세스는 데이터를 바이트 단위로 사용할 수 있습니다. 그러나 프로그램이 읽기, 쓰기 등과 같은 libc의 std io 기능을 사용할 때마다 libc는 프로그램이 터미널에 쓰고 있는지 여부에 따라 이러한 프로그램의 입력/출력을 버퍼링합니다.
기본적으로 libc는 프로그램이 터미널에 쓰는 중이라면 라인 단위로 출력을 버퍼링하고, 터미널에 쓰지 않는 경우에는 블록 단위로 출력을 버퍼링합니다.
stdbuf
Linux에서는 glibc를 사용하여 아래와 같이 다음 명령을 사용하여 이 동작에 영향을 줄 수 있습니다 .
stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''
명령에는 라인 기반 출력 버퍼를 사용하고 , cat
첫 번째 명령에는 sed
라인 기반 입력 및 출력 버퍼를 , sed
마지막 명령에는 라인 기반 입력 버퍼를 사용합니다.
답변3
-u
sed의 옵션을 사용하여 버퍼링을 최소화할 수 있습니다.
cat | sed -u '' | sed ''