저는 주로 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 ''