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 cat
tidak pernah mendukung outputnya. Entah itu tidak menggunakan stdio
atau mengubah stdio
kebijakan buffering default .
Saya bisa yakin Anda menggunakan GNU cat
dan bukan unix lain cat
karena yang lain tidak akan berperilaku seperti ini. Unix tradisional cat
memiliki -u
opsi untuk meminta keluaran tanpa buffer. GNU cat
mengabaikan -u
opsi karena outputnya selalu tidak dibuat-buat.
Jadi, setiap kali Anda memiliki pipa dengan cat
di sebelah kiri, dalam sistem GNU, bagian data melalui pipa tidak akan tertunda. The cat
bahkan 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|sed
contoh, tr
masih menerima data dari cat
segera setelah Anda menekan Enter, tetapi tr
mengikuti stdio
kebijakan 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.
sed
juga mengikuti stdio
kebijakan 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 sed
sedang memblokir-buffer outputnya, Anda harus mengetik dua kali lebih banyak (untuk mengisi tr
buffer output dan sed
output penyangga).
GNU sed
memiliki -u
opsi jadi jika Anda membalik urutan dan menggunakan cat|sed -u|tr
Anda akan melihat output muncul kembali secara instan. ( sed -u
Pilihannya 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 stdbuf
yang memungkinkan Anda mengubah mode buffering dari setiap perintah yang menggunakan stdio
default. Agak rapuh karena digunakan LD_PRELOAD
untuk mencapai sesuatu yang tidak didukung oleh pustaka C, tetapi dalam kasus ini tampaknya berfungsi:
cat | stdbuf -o 0 tr '[:lower:]' '[:upper:]' | sed 'p'
cat
buffering sampai stdin ditutup.