추가 읽기

추가 읽기

저는 (Ruby로) 프로그램을 작성했는데 잘 작동합니다. 몇 줄의 텍스트를 인쇄한 다음 잠시 멈췄다가 반복합니다.

잘 작동하지만(Mac OS X의 터미널에서) 출력 기록을 유지하려면 다음을 사용할 수 있습니다.

ruby myscript.rb | tee record.txt

그런 다음 출력이 특정 양, 아마도 몇 kb에 도달할 때까지 출력이 화면에 표시되지 않습니다. 그러나 이는 화면에 5~10분 동안 아무것도 표시되지 않음을 의미할 수 있습니다(CTRL-C를 누르면 파일에 아무것도 표시되지 않음).

출력을 플러시하도록 프로그램을 수정할 수 있지만 응용 프로그램은 STDOUT의 출력이 어떤 용도로 사용되는지 알 수 없어야 한다고 생각합니다. 그렇다면 tee잘 작동하도록 만드는 것이 가능합니까 (옵션이 있을 수도 있음). 아니면 다른 명령을 사용할 수 있습니까? 아니면 Bash 또는 터미널 응용 프로그램의 옵션일 수 있습니까? 어떤 방법이 있나요?

답변1

나는 응용 프로그램이 STDOUT의 출력이 무엇에 사용되는지 알 수 없어야 한다고 생각합니다.

당신은 잘못 생각합니다. C 및 C++ 언어를 포함한 여러 프로그래밍 언어의 런타임 라이브러리는 최종 장치에 대한 스트림 연결이 감지되는지 여부에 따라 버퍼링을 변경하는 의미를 공유합니다.

많은 경우 이것이 언어를 정의하는 부분입니다. C 언어 표준은 예를 들어 다음과 같이 말합니다.

표준 오류 스트림은 처음 열릴 때 완전히 버퍼링되지 않습니다. 표준 입력 및 표준 출력 스트림은 표준 입력 및 표준 출력 스트림이 대화형 장치를 참조하지 않는다고 판단할 수 있는 경우에만 완전히 버퍼링됩니다.

스트림이 터미널 장치에 연결되지 않은 경우 일반적인 선택은 단위 버퍼링, 라인 버퍼링 또는 전체 버퍼링을 선택하는 것입니다. 단위 버퍼링과 라인 버퍼링은 일반적으로 표준 오류에 사용됩니다. 표준 출력은 완전히 버퍼링됩니다. 하지만 이는 언어마다 다릅니다.

따라서 출력 스트림이 이러한 언어의 파이프인 경우 출력이 완전히 버퍼링되지 않도록 하려면 다음을 수행해야 합니다.

  • 프로그램을 자체적으로 작성하여 표준 출력을 라인 버퍼링, 스마트 버퍼링 또는 버퍼링되지 않게 만듭니다.
  • stdbuf명령 과 같이 특정 프로그래밍 언어의 런타임 라이브러리에 연결되는 것을 사용하십시오.만약에귀하의 프로그래밍 언어는 C이거나 C 런타임 라이브러리(I/O 스트리밍 부분)를 기본으로 사용합니다(일부 프로그래밍 언어는 이를 수행하지 않음).
  • ptybandage프로그램이 표준 출력을 터미널로 생각하도록 하는 동시에 해당 출력을 파이프의 쓰기 끝으로 보내는 것과 같은 도구를 사용하십시오 .

추가 읽기

답변2

답변을 살펴보시기 바랍니다.https://stackoverflow.com/a/11337109/5656721왜냐하면 이것은 일반적인 질문이기 때문입니다. 당신이 사용할 수있는표준 버퍼또는버퍼링 해제또한 귀하의 Ruby 프로그램에서도 작동합니다.

관련 정보