*nix 쉘: 명령의 모든 파이프에 대해 파이프 버퍼링을 비활성화하는 방법은 무엇입니까?

*nix 쉘: 명령의 모든 파이프에 대해 파이프 버퍼링을 비활성화하는 방법은 무엇입니까?

제 생각에는모든stdbuf -oL파이프는 버퍼링되지 않으므로 모든 파이프 명령을 입력할 필요가 없습니다 . 여러 파이프가 있는 명령을 작성할 때 환경 변수나 이를 전역적으로 활성화하는 무언가가 있거나 적어도 명령의 나머지 파이프에 대해 있으면 좋을 것입니다.

네, 알아요 unbuffer. stdbuf하지만 파이프마다 호출해야 합니다... 자주 하는 일이라 타이핑을 아끼려고 합니다.

그것은 다음과 같습니다:

앞으로:

stdbuf -oL command_1 | stdbuf -oL command_2 | stdbuf -oL command_3

뒤쪽에:

BUFFERING=-oL command_1 | command_2 | command_3

답변1

stbufGNU Coreutils의 유틸리티는 환경 변수를 설정하여 LD_PRELOAD모든 하위 프로세스가 공유 라이브러리를 열도록 강제합니다 . libstdbuf.so또한 라이브러리에 인수를 전달하기 위해 다른 변수를 설정합니다.

이러한 환경 변수를 직접 설정할 수 있습니다.

env그들이 무엇인지 봅시다 :

$ stdbuf -oL env | grep -E '^LD_PRELOAD|^_STDBUF_'
_STDBUF_O=L
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so

좋아, eval위의 내용만 있으면 다음을 얻습니다.

$ eval $(stdbuf -oL env | grep -E '^LD_PRELOAD|^_STDBUF_')
$ echo $LD_PRELOAD 
/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so
$ echo $_STDBUF_O 
L

한 가지 더, 우리는 아직 이 항목을 내보내도록 쉘에 지시하지 않았습니다.

$ export LD_PRELOAD _STDBUF

stdout이제 우리가 실행하는 프로그램에서 C 스트림이 버퍼링 해제되어야 합니다.

그러나 다음을 사용하여 중첩 쉘을 실행하는 것이 더 간단해 보입니다 setbuf.

$ stdbuf -oL bash
$ echo $LD_PRELOAD
/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so

exec원래 쉘을 교체하는 데 사용할 수 있습니다.

$ exec stdbuf -oL bash

관련 정보