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|tr
ve cat|tr|sed
). Ancak bir istisna var: GNU cat
hiçbir zaman çıktısını tamponlamaz. Ya kullanmaz stdio
ya da varsayılan stdio
tamponlama politikasını değiştirir.
GNU’yu kullandığınızdan eminim, cat
başka bir unix cat
değil, diğerleri böyle davranmaz. Geleneksel unix'in tamponlanmamış çıktı talep etme seçeneği cat
vardır -u
. GNU cat
bu -u
seç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. cat
Hatta 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, tr
hala veri alıyor cat
olarak basar basmaz Enter, ama tr
takip ediyor stdio
her 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.
sed
aynı zamanda stdio
varsayı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 sed
oldu 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 sed
sahiptir, -u
eğ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 -u
Seç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ı stdbuf
kullanan herhangi bir komutun tamponlama modunu değiştirmenize izin veren bir yardımcı program vardır stdio
. LD_PRELOAD
C 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'
cat
stdin kapanana kadar tamponlama yapıyor.