왜
$ ping -c 4 -W 1 127.0.0.1 | cat
그리고
$ ping -c 4 -W 1 1.1.1.1
출력을 즉시 인쇄하는 반면
$ ping -c 4 -W 1 1.1.1.1 | cat
4초 동안 아무것도 인쇄하지 않고 모든 출력을 한 번에 인쇄하시겠습니까?
첫 번째 명령은 예상대로 성공적인 ping과 다른 두 개의 인쇄 시간 초과를 인쇄합니다.
답변1
셸 파이프라인에 대한 ping 출력의 경우 버퍼링으로 다른 동작을 설명할 수 있습니다. ping은 성공적으로 수신된 각 에코 패킷을 보고한 후 fflush()를 호출하므로 라인은 즉시 cat으로 전송되어 즉시 출력됩니다. 핑 정말아니요fflush()는 시간 초과 패킷을 보고하는 라인을 작성한 후 호출되므로 stdio는 ping이 exit()를 호출할 때까지 해당 라인을 버퍼링한 다음 모든 라인을 cat으로 보낸 다음 출력합니다.
터미널에 직접 ping 출력을 하는 경우 stdio 라인은 기본적으로 ttys와 관련된 스트림에 모든 출력을 버퍼링하므로 성공 및 실패 출력이 즉시 표시됩니다. 따라서 각 출력 라인은 stdio에 의해 버퍼링되는 대신 즉시 터미널로 전송됩니다.
정신적으로사람에게 낚시하는 법을 가르치다, OS X를 읽어 보면 이를 확인할 수 있습니다.핑의 소스 코드그리고 OS X를 읽어보세요stdio 맨페이지.
답변2
나는 이것이 cat이 입력을 얻는 방식 때문이라고 생각합니다. 첫 번째 명령은 종료 상태 2를 제공하는 반면 ping되는 IP 주소는 종료 상태 0을 제공합니다.
즉, cat은 STDOUT의 출력을 즉시 표시하는 반면 STDERR을 버퍼에 넣은 다음 명령이 종료되면 표시합니다.
답변3
DNS 또는 ICMP 에코 응답 패킷을 기다리고 있습니다. DNS인 경우 해당 -n
옵션을 사용해 보세요. 그렇지 않은 경우 ICMP 에코 요청에 응답하는 호스트와 그렇지 않은 호스트(또는 해당 응답이 도중에 필터링됨)를 구별해 보십시오.