다음 명령이 출력을 생성하지 않는 이유는 무엇입니까?
$ tail -f /etc/passwd | tail
대해 읽은 후완충기, 나는 성공하지 못한 채 다음을 시도했습니다.
$ tail -f /etc/passwd | stdbuf -oL tail
다음은 출력을 생성합니다.
$ tail /etc/passwd | tail
이는 또한 사실입니다:
$ tail -f /etc/passwd | head
저는 tail 버전 8.21(GNU coreutils)을 사용하고 있습니다.
답변1
tail -f
꼬리는 사실 현재로서는 알려지지 않은 것인데, tail
다음에는 어떻게 알 수 있을까요? 반면에 tail -f
헤더는 알려져 있으므로 처리될 수 있습니다.
또는 더 간단하게 말하면 tail
파일 끝을 기준으로 하지만 출력 스트림 tail -f
에는 EOF가 없습니다(적어도 종료되기 전은 아님).
첫 번째 pid를 찾아서 tail
죽이면 다음을 수행해야 합니다.그 다음에두 번째 출력을 참조하세요.
답변2
기술 솔루션
스트림을 입력으로 실행하는 경우 스트림을 읽을 때 채워지는 라인 버퍼가 tail
유지되지만 n
스트림 끝에 도달할 때까지 라인을 출력할 수 없습니다. 즉, EOF
스트림에서 읽으려고 할 때 특수 코드가 수신됩니다. 입력 스트림. 호출이 tail -f
종료되지 않으므로 스트림을 닫지 않으므로 스트림의 마지막 10개 행을 반환할 수 없습니다.
답변3
tail
마지막 X 줄을 표시합니다. tail -f
동일한 작업을 수행하지만 본질적으로 무한 루프입니다. 시작 시 파일의 마지막 X 줄을 표시한 다음 일부 OS 마법(예: inotify)을 사용하여 새 줄을 감시하고 표시합니다.
그 일을 잘 수행하기 위해서는tail
파일의 끝을 찾을 수 있어야 합니다.tail
파일의 끝을 찾을 수 없으면 "last"가 정의되지 않았기 때문에 마지막 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의 파일 오프셋입니다(마지막 바이트의 오프셋보다 1 더 큼).
그것이 바로 마법입니다. 모든 구성에서 tail이 작동하려면 파일 끝이 필요합니다. head
이러한 제한이 없으면 파일의 시작 부분만 필요합니다(그렇지 않을 수도 있음, try head test.pipe
). sed
및 와 같은 스트림 지향 도구는 awk
파일의 시작이나 끝이 필요하지 않으며 버퍼에서 작동합니다.
답변4
이 기능은 tail
입력 또는 파일의 마지막 부분인 "꼬리"를 표시하는 것입니다. (이 옵션은 -f
나중에 수행할 작업에 관한 것이므로 여기서는 관련이 없습니다.)
파일을 고려해 봅시다:
무엇인가요파일의 마지막 부분?
이것이 다음과 같다고 가정하자마지막 n줄파일의.
입력 파일에서 한 줄을 읽을 때 i
그것을 인쇄해야 하는지 어떻게 결정합니까?
우리는 그것이 마지막 부분에 있는지 알 수 없습니다. 왜냐하면 우리는 마지막 줄이 무엇이 될지 모르기 때문입니다. 그래서 우리는할 수 없다지금 인쇄하세요.
우리는해야합니다줄을 서다이것이 마지막 몇 줄의 일부이거나 더 많은 줄을 n
알고 있기 때문에 더 이상 마지막 몇 줄의 일부가 아니라는 것이 분명해질 때까지n
우리가 지금 오면파일 끝, 우리는 n
우리가 보관한 마지막 몇 줄이 실제로 n
파일의 마지막 몇 줄이라는 것을 알고 있습니다.
이제 이 경우에는
tail -f /etc/passwd | tail
먼저 tail
파일을 읽은 다음 기다리세요.더 많은 데이터 얻기그것도 적어보세요. 그래서 그럴 것이다파일 끝 신호를 내보내지 않음파일이 끝나면 두 번째 꼬리까지 읽습니다. 이건 없어요, 두 번째tail
알림을 받지 않음파일의 끝이므로 다음을 수행할 수 있습니다.결코 알아내지 못할 것이다인쇄해야 할 마지막 몇 줄입니다.