다음 명령 시퀀스가 ​​포함된 파이프라인 블록

다음 명령 시퀀스가 ​​포함된 파이프라인 블록

URL이 포함된 파일을 읽은 다음 IP 주소를 인쇄하는 스크립트가 있습니다. 그런데 명령을 추가할 때 파이프가 차단되는 이유에 대한 리소스를 찾을 수 없습니다.

cut -d" " -f4 

파이프 끝에. 이것은 완전한 명령입니다.

for url in $(cat urls); do host $url; done | grep "has address" | cut -d" " -f4

출력은 grep 명령까지 비동기적으로 인쇄됩니다. grep 이후 명령의 출력은 호스트 명령이 모든 URL을 처리할 때까지 차단됩니다. 왜 이런 일이 일어나는지 말해 줄 수 있는 사람이 있나요?

답변1

grep터미널에 쓰지 않으면 출력이 버퍼링됩니다. 를 사용하면 grep --line-buffered각 라인을 즉시 출력 할 수 있습니다 . 고려하다:

느린 출력 명령을 실행하고 터미널에 grep을 실행합니다.

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep to
printing
to grep
printing
to grep
printing
to grep

느린 출력 명령을 실행하고 컷에 대해 grep을 실행합니다.

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep to | cut -d" " -f1-2
printing
printing
printing
to grep
to grep
to grep

느린 출력 명령을 실행하고 잘라내기 옵션을 사용하여 grep을 실행합니다 --line-buffered.

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep --line-buffered to | cut -d" " -f1-2
printing
to grep
printing
to grep
printing
to grep

관련 정보