유닉스에서 모든 것을 보았다고 생각했습니다. 이 질문은 저의 밀수에서 나를 때렸습니다. 정말 좋은 질문입니다!
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필요도 파일의 시작 또는 끝을 : 그들은 버퍼에서 작동합니다.