추가 읽기

추가 읽기

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

(Mac OS X의 터미널에서는) 잘 작동하지만 출력 기록을 유지하려면 다음을 사용하십시오.

ruby myscript.rb | tee record.txt

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

출력을 플러시하도록 프로그램을 수정할 수 있지만 STDOUT에 대한 출력과 함께 사용되는 내용에 대해 앱이 불가지론적이어야 한다고 생각했습니다. 따라서 tee잘 작동하도록 만들 수 있거나(아마도 옵션을 사용하여) 다른 명령을 사용할 수 있거나 Bash 또는 터미널 앱의 옵션일 수 있습니까? 방법이 있나요?

답변1

저는 앱이 STDOUT에 대한 출력과 함께 사용되는 내용에 대해 불가지론적이어야 한다고 생각했습니다.

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

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

처음 열었을 때 표준 오류 스트림은 완전히 버퍼링되지 않았습니다. 표준 입력 및 표준 출력 스트림은 스트림이 대화형 장치를 참조하지 않는 것으로 결정될 수 있는 경우에만 완전히 버퍼링됩니다.

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

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

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

추가 읽기

답변2

답변을 봐주세요https://stackoverflow.com/a/11337109/5656721일반적인 문제이니까요. 당신은 사용할 수 있습니다표준 버프또는언버퍼귀하의 루비 프로그램에도 마찬가지입니다.

관련 정보