출력 파이프는 Fish에서 EOF를 기다립니다.

출력 파이프는 Fish에서 EOF를 기다립니다.

csearch 출력을 가져와서 색상을 지정하고 싶습니다. 다음과 같습니다.

/home/bp/whatever.txt:1:foo

이것은 작동합니다:

csearch -n -- $term \
  | env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
  | grep -P --color=always -- $term \
  | less -RFX

csearch그러나 아무것도 표시하기 전에 전체 출력이 계산될 때까지 기다립니다.

이제 이렇게 하면:

csearch -n -- $term \
  | env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
  | pv
  | grep -P --color=always -- $term \
  | less -RFX

...데이터가 흐르는 것을 볼 수 있지만 만약 그렇게 한다면:

csearch -n -- $term \
  | env GREP_COLORS='mt=02;35' grep --color=always -P '^[^:]+:[^:]+:' \
  | grep -P --color=always -- $term \
  | pv
  | less -RFX

...데이터 흐름이 없습니다. 두 번째는 grepEOF를 기다리는 것 같습니다.

두 grep을 모두 추가해도 --line-buffered나에게는 아무런 소용이 없는 것 같습니다.

이 명령 파이프라인이 EOF를 기다리는 이유는 무엇입니까?

답변1

를 사용하고 있습니다 fish. 즉, 실제로는 을 사용하고 있지 않지만 다음 grep과 같습니다.

function grep
    command grep --color=auto $argv
end

Fish 코드 블록은 출력을 전송하지 않습니다..

grep첫 번째 항목에서는 이미 래핑되어 env함수를 무시하기 때문에 문제가 되지 않습니다 .

수정 grep하려면 변경하세요 ./bin/grep

관련 정보