tr의 버퍼링을 비활성화할 수 있나요?

tr의 버퍼링을 비활성화할 수 있나요?

trLongRunningCommand|tr \\n ,LongRunningCommand의 입력이 몇 킬로바이트를 축적한 후에만 명령이 출력 생성을 시작하도록 입력을 버퍼링하는 것으로 보입니다 .

tr버퍼링 없이 줄 바꿈을 다른 문자로 바꿀 수 있는 이 버퍼링이나 다른 명령을 강제로 중지하는 방법이 있습니까 ?


추신 : 처음 두 가지 제안을 시도했습니다파이프라인에서 버퍼링 끄기성공하지 못했습니다.

답변1

명령은 일반적으로 입력을 버퍼링하지 않습니다. 청크에 대해 작업을 수행 read()하지만 파이프에서 읽을 때 파이프에 바이트가 많지 않으면 read()시스템 호출은 가능한 한 많은 문자를 반환하고 응용 프로그램은 일반적으로 가능하면 이를 사용합니다.

한 가지 주목할만한 예외는 입력 버퍼가 가득 찰 때까지 mawk계속된다는 것입니다.read()

응용프로그램은 버퍼링을 수행합니다.산출(Stdout) 그러나. 일반적인 동작은 출력이 tty에 대한 것인 경우 버퍼링이 한 줄씩 수행된다는 것입니다(즉, 출력할 전체 라인이 있을 때까지 또는 매우 어려운 경우에는 stdout에 쓰기를 시작하지 않습니다). 큰 청크 전체) 긴 줄), 다른 모든 파일 형식의 경우 버퍼링은 블록 단위로 수행됩니다(즉, 쓸 수 있는 블록이 있을 때만 쓰기가 시작됩니다(예: 4KiB/8KiB... 소프트웨어 및 시스템에 따라 다름)). ).

따라서 귀하의 경우 LongRunningCommand출력은 블록 단위로 버퍼링될 수 있으며(출력은 tty가 아닌 파이프이기 때문에) tr출력은 터미널일 수 있으므로 라인 단위로 버퍼링될 수 있습니다.

그러나 출력에서 ​​모든 개행 문자를 제거하므로 한 줄도 출력되지 않으므로 버퍼링이 청크로 발생합니다.

LongRunningCommand따라서 여기서는 및 의 버퍼링을 비활성화하려고 합니다 tr. GNU 또는 FreeBSD 시스템의 경우:

stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,

줄을 쉼표로 연결하려면 를 사용하는 것이 더 좋습니다 paste -sd , -. 이렇게 하면 출력이 줄바꿈으로 종료됩니다(여전히 버퍼링을 비활성화해야 할 수도 있음).

답변2

개행 문자를 로 바꾸려면 ","다음을 실행하세요.

awk '{ printf "%s,", $0 }'

터미널에 출력할 때 GNU awk( gawk) 및 Solaris는 stdin에서 라인 버퍼링으로 실행되며 stdout을 버퍼링하지 않습니다. Ubuntu에서 발생하는 nawkawk인 경우 동일한 버퍼링 동작을 얻을 수 있는 옵션을 제공할 수 있습니다.mawk-W interactive

관련 정보