stdioÇoğu unix programının kullandığı C standart G / Ç kütüphanesi ( ) tarafından takip edilen genel bir tamponlama kuralı var . Çıkış bir terminale gidiyorsa, her satırın sonunda temizlenir; Aksi halde, yalnızca tampon (Linux / amd64 sistemimde 8K; sizinkinde farklı olabilir) dolu olduğunda temizlenir.
Tüm kamu hizmetleri genel kural şu olsaydı, çıkış senin örneklerin tümünde gecikmiş görecekti ( cat|sed, cat|trve cat|tr|sed). Ancak bir istisna var: GNU cathiçbir zaman çıktısını tamponlamaz. Ya kullanmaz stdioya da varsayılan stdiotamponlama politikasını değiştirir.
GNU’yu kullandığınızdan eminim, catbaşka bir unix catdeğil, diğerleri böyle davranmaz. Geleneksel unix'in tamponlanmamış çıktı talep etme seçeneği catvardır -u. GNU catbu -useçeneği görmezden geliyor çünkü çıktı her zaman arabelleksiz.
Bu yüzden cat, solda bir boruya sahip olduğunuzda , GNU sisteminde, borudan verilerin geçişi gecikmeyecektir. catHatta satır satır gitmiyor - Terminal o yapıyor. Cat için giriş yazarken, terminaliniz "kanonik" moddadır - satır tabanlıdır, backspace ve ctrl-U gibi düzenleme tuşları ile size göndermeden önce yazdığınız satırı düzenleme şansı sunar Enter.
In cat|tr|sedÖrneğin, trhala veri alıyor catolarak basar basmaz Enter, ama trtakip ediyor stdioher satırdan sonra floş değil bu yüzden, onun çıkış bir boruya gidiyor: Varsayılan politika. Tampon dolduğunda veya hangisi önce gelirse, bir EOF alındığında ikinci boruya yazar.
sedaynı zamanda stdiovarsayılan politikayı da takip ediyor , ancak çıktısı bir terminale gidiyor, böylece her satırda bittiği anda yazacak. Bu boru hattının diğer ucundaki kadar bir şey gösterilmeden önce yazmalısınız ne kadar üzerinde bir etkisi vardır - eğer sedoldu blok tamponlama çıktısı, çok (dolgu olarak iki kez yazmak zorunda ediyorum tr'çıktı tamponunun ler ve sed ' ın çıkışını tampon).
GNU seçeneğine sedsahiptir, -ueğer emri tersine çevirirseniz ve kullandıysanız cat|sed -u|tr, çıktının anında tekrar göründüğünü görürsünüz. ( sed -uSeçenek başka bir yerde mevcut olabilir ama bunun gibi eski bir unix geleneği olduğunu sanmıyorum cat -u) Söyleyebileceğim kadarıyla eşdeğer bir seçenek yok tr.
Varsayılanları stdbufkullanan herhangi bir komutun tamponlama modunu değiştirmenize izin veren bir yardımcı program vardır stdio. LD_PRELOADC kütüphanesinin desteklemesi için tasarlanmadığı bir şeyi başarmak için kullandığı için biraz kırılgandı , ancak bu durumda işe yarıyor gibi görünüyor:
cat | stdbuf -o 0 tr '[:lower:]' '[:upper:]' | sed 'p'
catstdin kapanana kadar tamponlama yapıyor.