UNIX'te her şeyi gördüğümü sanıyordum. Bu soru beni düzgünlüğümden mahrum etti. Ne güzel bir soru!
tailson X satırını gösterir. tail -faynı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 tailyapabilmek için dosyanın sonunu bulabilmeniz gerekir. Eğer taildosyanın sonuna bulamıyorum "son" tanımsız, bunun nedeni, son X hatları gösteremez. Peki tailbu 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.
tailBir dosya sistemi borusundan son satırları vermek isterseniz aynı davranışı elde edersiniz. Düşünmek:
$ mkfifo test.pipe
$ tail test.pipe
stdbufalgı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_linesiş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. headBu 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 sedve awkgereksinim duyan araçlar : arabelleklerde çalışırlar.