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