UNIX'te her şeyi gördüğümü sanıyordum. Bu soru beni düzgünlüğümden mahrum etti. Ne güzel bir soru!
tail
son X satırını gösterir. tail -f
aynısını yapar, ancak esasen sonsuz bir döngüde gerçekleşir: başlangıçta, dosyanın son X satırını gösterip ardından bazı işletim sistemi sihrini kullanarak (inotify gibi) izleyin ve yeni satırları gösterin.
İşini tail
yapabilmek için dosyanın sonunu bulabilmeniz gerekir. Eğer tail
dosyanın sonuna bulamıyorum "son" tanımsız, bunun nedeni, son X hatları gösteremez. Peki tail
bu durumda ne yapar ? Dosyanın sonunu bulana kadar bekler.
Bunu düşün:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
Bu asla ilerleme kaydetmedi gibi görünmektedir, çünkü kesin bir dosya sonu yoktur chatter
.
tail
Bir dosya sistemi borusundan son satırları vermek isterseniz aynı davranışı elde edersiniz. Düşünmek:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
algılanan problemi aşmak asil bir girişimdi. Olsa da, asıl önemli olan G / Ç arabelleklemesinin kök nedeni olmaması: kesin bir dosya sonu eksikliği. Tail.c kaynak kodunu kontrol ederseniz , file_lines
işlev yorumunun okuduğunu görürsünüz :
END_POS, EOF'nin dosya ofsetidir (bir tanesi son baytın ofsetinden daha büyük).
ve bu sihir. Herhangi bir konfigürasyonda kuyruk çalışması için dosyanın sonuna ihtiyacınız var. head
Bu kısıtlamaya sahip değil, sadece bir dosya başlangıcına ihtiyaç duyuyor (ki bu olmayabilir head test.pipe
). Akışa yönelik araçlar , dosyanın başlangıcını veya sonunu beğenmeyen sed
ve awk
gereksinim duyan araçlar : arabelleklerde çalışırlar.