sed/head 및 명명된 파이프/FIFO의 이상한 동작(두 번의 쓰기 필요)

sed/head 및 명명된 파이프/FIFO의 이상한 동작(두 번의 쓰기 필요)

mkfifo쉘에서 fifo를 생성하고 rw 모드로 열었습니다 exec 3<>fifo.

다른 쉘에서 실행 sed 1q <&3하고 fifo에 한 줄을 쓰면 sed는 fifo에 다른 줄을 쓸 때까지 해당 줄을 인쇄하지 않습니다. 왜 이런 일이 발생합니까? (이런 일은 일어나지 않을 거예요 head -n1)

답변1

이를 쉘 세션에서 복사할 수 있습니다.

(echo foo; sleep 3; echo bar) | busybox sed 1q

지연 후에만 별도의 출력 라인이 나타나는 것을 볼 수 있습니다.

일어날 수 있는 일은 Busybox의 구현이 $첫 번째 줄을 처리하기 전에 (마지막 줄) 주소 지정자가 일치해야 하는지 여부를 결정하기 위해 계속해서 읽는 것입니다. 파이프가 닫힐 때까지 또는 두 번째 줄이 나타날 때까지 $어떤 방식으로 구문 분석해야 할지 결정할 수 없습니다.

이는 모든 sed에서는 발생하지 않습니다. 예를 들어 내 Mac의 GNU sed 및 sed는 첫 번째 줄을 즉시 인쇄합니다. 스크립트가 사용되지 않기 때문에 이를 수행할 수 $있으며 필요한 모든 정보가 이미 거기에 있습니다. 스크립트를 다음과 $같이 변경하면

(echo foo; sleep 3; echo bar) | sed -n '$!p'

두 번째 줄도 기다려야 합니다.

$아마도 Busybox는 더 간단하고 사용되었는지 확인하지 않고 기다릴 것입니다 .

관련 정보