unbuffer(1)와 stdbuf(1) 사이에 차이점이 있습니까? 내가 아는 한, unbuffer는 처음에 libc 함수 set(X)buf를 호출한 다음 그대로 두는 것 이상의 기능을 수행합니다.
답변1
그들은 완전히 다른 방식으로 작동합니다.
unbuffer 프로그램은 지정된 명령을 실행하기 위해 사용합니다. Expect는 자식 프로세스의 stdout에 연결하기 위해 pseudo-tty를 생성하기 때문에 자식 프로세스는 블록 버퍼링 대신 라인 버퍼링을 사용해야 한다고 생각하도록 속일 수 있습니다. 일부 프로그램은 isatty(stdout)가 true일 때 동작을 변경하지만 다른 프로그램은 그렇지 않으며 어떤 프로그램이 변경되고 어떤 프로그램이 변경되지 않는지 알기가 어렵습니다.
동적으로 로드된 바이너리의 경우 stdbuf 프로그램은 libstdbuf를 libc 앞에 배치하려고 시도합니다. 그 중 libstdbuf는 libc stdio 호출의 기본 버퍼링 전략을 재정의합니다.
나는 이것을 찾았다
apt-get source expect coreutils
그리고 각 프로그램의 관련 소스코드를 읽어보세요.
답변2
긴 이야기 짧게
이것이전에 허용된 답변여전히 정확합니다. 내 경험으로 볼 때 가장 큰 차이점은버퍼링 해제-p
사용이 더 간단하고 파이프에서 표준 입력을 버퍼링하기 위한 스위치( )만 제공합니다 .버퍼 취소아니요.
구체적인 사용 사례는 다양할 수 있지만 다음과 같은 일반적인 조언을 드리고 싶습니다.
- 사용버퍼링되지 않은stdin을 버퍼링해야 하고 stdin 버퍼링의 제한 사항을 알고 있는 경우, 즉 파이프가 일찍 종료되거나 EOF에서 일찍 종료되면 중단됩니다.
- 사용표준 버퍼입력, 출력 및 오류 I/O 스트림의 버퍼링에 대해 별도의 제어가 필요하고 표준 입력을 버퍼링할 필요가 없는 경우.
Coreutils의 Stdbuf
이것표준 버퍼GNU의 일부 유틸리티핵심 도구, 입력, 출력 및 오류 스트림에 대해 별도의 플래그를 제공합니다. 매뉴얼 페이지에 다음 사항이 명시되어 있다는 점은 주목할 가치가 있습니다.
- 자체적으로 버퍼를 조정하는 tee와 같은 명령은 영향을 받지 않습니다.
- I/O 스트림을 사용하지 않는 필터는 영향을 받지 않습니다.
- 라인 버퍼링은 표준 입력에 영향을 주지 않습니다.
그러니까 일반적으로 말하면,표준 버퍼더 많은 제어권 제공버퍼링 해제, 하지만 몇 가지 주의 사항이 있습니다. man 1 stdbuf
(또는 man 1 gstdbuf
일부 시스템에서는) 다음과 같이 말합니다.
참고: COMMAND가 표준 스트림(예: "tee")의 버퍼링을 조정하는 경우 "stdbuf"에 대한 해당 변경 사항이 재정의됩니다. 또한 일부 필터(예: "dd" 및 "cat" 등)는 I/O 스트림을 사용하지 않으므로 "stdbuf" 설정의 영향을 받지 않습니다.
버그
GLIBC 플랫폼에서 완전 버퍼 모드를 사용할 때에도 버퍼 크기를 지정하면 정의되지 않은 작업이 발생합니다.
Expect에서 버퍼링되지 않음
이것버퍼링되지 않은표준 중 하나인 명령예상되는손잡이가 더 적은 명령줄 예제 도구입니다. 이것은 당신에게 좋을 수도 있고 그렇지 않을 수도 있습니다. 개인적으로 나는 단순한 것을 선호하지 않는 한필요추가 손잡이. 반면에 비록표준 버퍼표준 입력에는 적용되지 않습니다.버퍼링되지 않은예, 이 옵션을 사용하면 가능합니다 -p
.
일반적으로 unbuffer는 stdin에서 읽지 않습니다. 이는 경우에 따라 언버퍼 사용을 단순화합니다. 파이프라인에서 버퍼 해제를 사용하려면 -p 플래그를 사용하십시오.
그러나 이 동작에는 주의 사항과 그 이유에 대한 추가 설명이 함께 제공됩니다 man 1 unbuffered
. 다음 내용을 읽어보세요.
unbuffer -p는 unbuffer에 입력을 제공하는 프로세스가 종료되면 제대로 작동하지 않을 수 있습니다. 고려하다:
프로세스 1 | 버퍼링 취소 -p 프로세스 3 |
process1이 종료되면 process2가 아직 완료되지 않았을 수 있습니다. unbuffer는 process2를 얼마나 오래 기다려야 하는지 알 수 없으며, process2는 예를 들어 필터인 경우 완료되지 않을 수 있습니다. 편의상 언버퍼는 입력 또는 프로세스2에서 EOF를 만나면 간단히 종료됩니다.
이 경우,버퍼링되지 않은Expect를 직접 사용하거나 다양한 다른 해결 방법을 사용하여 파이프라인을 수동으로 조정하는 것이 좋습니다.