Ada aturan buffering umum yang diikuti oleh pustaka I / O standar C ( stdio) yang digunakan sebagian besar program unix. Jika output pergi ke terminal, itu memerah pada akhir setiap baris; jika tidak maka akan memerah hanya ketika buffer (8K pada sistem Linux / amd64 saya; bisa berbeda pada Anda) penuh.
Jika semua utilitas Anda mengikuti aturan umum, Anda akan melihat output tertunda dalam semua contoh Anda ( cat|sed, cat|tr, dan cat|tr|sed). Tapi ada pengecualian: GNU cattidak pernah mendukung outputnya. Entah itu tidak menggunakan stdioatau mengubah stdiokebijakan buffering default .
Saya bisa yakin Anda menggunakan GNU catdan bukan unix lain catkarena yang lain tidak akan berperilaku seperti ini. Unix tradisional catmemiliki -uopsi untuk meminta keluaran tanpa buffer. GNU catmengabaikan -uopsi karena outputnya selalu tidak dibuat-buat.
Jadi, setiap kali Anda memiliki pipa dengan catdi sebelah kiri, dalam sistem GNU, bagian data melalui pipa tidak akan tertunda. The catbahkan tidak akan baris demi baris - terminal Anda melakukan hal itu. Saat Anda mengetikkan input untuk cat, terminal Anda berada dalam mode "kanonik" - berbasis garis, dengan tombol pengeditan seperti backspace dan ctrl-U menawarkan Anda kesempatan untuk mengedit baris yang telah Anda ketikkan sebelum mengirimkannya Enter.
Dalam cat|tr|sedcontoh, trmasih menerima data dari catsegera setelah Anda menekan Enter, tetapi trmengikuti stdiokebijakan default: outputnya adalah pipa, sehingga tidak memerah setelah setiap baris. Itu menulis ke pipa kedua ketika buffer penuh, atau ketika EOF diterima, mana yang lebih dulu.
sedjuga mengikuti stdiokebijakan default, tetapi outputnya pergi ke terminal sehingga akan menulis setiap baris segera setelah selesai dengannya. Ini memiliki efek pada berapa banyak Anda harus mengetik sebelum sesuatu muncul di ujung pipa - jika sedsedang memblokir-buffer outputnya, Anda harus mengetik dua kali lebih banyak (untuk mengisi trbuffer output dan sed output penyangga).
GNU sedmemiliki -uopsi jadi jika Anda membalik urutan dan menggunakan cat|sed -u|trAnda akan melihat output muncul kembali secara instan. ( sed -uPilihannya mungkin tersedia di tempat lain tetapi saya tidak berpikir itu tradisi unix kuno seperti cat -u) Sejauh yang saya tahu tidak ada opsi yang setara untuk itu tr.
Ada utilitas yang disebut stdbufyang memungkinkan Anda mengubah mode buffering dari setiap perintah yang menggunakan stdiodefault. Agak rapuh karena digunakan LD_PRELOADuntuk mencapai sesuatu yang tidak didukung oleh pustaka C, tetapi dalam kasus ini tampaknya berfungsi:
cat | stdbuf -o 0 tr '[:lower:]' '[:upper:]' | sed 'p'
catbuffering sampai stdin ditutup.