유닉스에서 모든 것을 보았다고 생각했습니다. 이 질문은 저의 밀수에서 나를 때렸습니다. 정말 좋은 질문입니다!
tail
마지막 X 줄을 보여줍니다. tail -f
시작시 파일의 마지막 X 줄을 표시 한 다음 inotify와 같은 일부 OS 매직을 사용하여 모니터링하고 새 줄을 표시합니다.
작업을 수행하려면 tail
파일 끝을 찾을 수 있어야합니다. 경우 tail
파일의 끝을 찾을 수 없습니다 "마지막"이 정의되지 않기 때문에, 그것은 마지막으로 X 선을 표시 할 수 없습니다. 그래서 어떻게 않습니다 tail
이 경우에합니까? 파일의 끝을 찾을 때까지 기다립니다.
이걸 고려하세요:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
에서 파일의 끝이 절대 없기 때문에이 작업은 진행되지 않는 것 같습니다 chatter
.
tail
파일 시스템 파이프에서 마지막 행을 제공 하도록 요청하면 동일한 동작을 얻습니다 . 치다:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
인식 된 문제를 해결하는 것은 고귀한 시도였습니다. 그러나 중요한 사실은 I / O 버퍼링이 근본 원인이 아니라는 것입니다. 명확한 파일 끝이 없다는 것입니다. 당신이 체크 아웃하는 경우 tail.c 소스 코드를 , 당신은 볼 수 있습니다 file_lines
기능 댓글이 읽습니다
END_POS는 EOF의 파일 오프셋 (마지막 바이트의 오프셋보다 큰 것)입니다.
그것이 마법입니다. tail이 모든 구성에서 작동하려면 파일 끝이 필요합니다. head
그 제한이 없으므로 파일 시작 만하면됩니다 (필요하지 않을 수도 있습니다 head test.pipe
). 같은 지향 도구 스트리밍 sed
및 awk
필요도 파일의 시작 또는 끝을 : 그들은 버퍼에서 작동합니다.