Perintah biasanya tidak buffer input mereka. Mereka akan melakukan read()
untuk potongan besar, tetapi ketika membaca dari sebuah pipa, jika tidak ada banyak byte dalam pipa, read()
pemanggilan sistem akan kembali dengan sebanyak karakter yang ada dan aplikasi umumnya akan bekerja dengan itu jika dapat .
Pengecualian penting untuk hal itu adalah mawk
yang akan terus kembali read()
sampai buffer input penuh.
Aplikasi melakukan buffer output mereka (stdout). Perilaku yang biasa adalah bahwa jika output pergi ke tty, maka buffering akan menjadi garis-bijaksana (yaitu, itu tidak akan mulai menulis ke stdout sampai memiliki baris penuh ke output, atau blok-penuh untuk sangat garis panjang), sedangkan untuk setiap jenis file lainnya, buffering adalah dengan blok (yaitu, ia tidak akan mulai menulis sampai memiliki satu blok penuh untuk ditulis (sekitar 4KiB / 8KiB ... tergantung pada perangkat lunak dan sistemnya) )).
Jadi dalam kasus Anda LongRunningCommand
kemungkinan buffer outputnya dengan blok (karena outputnya adalah pipa dan bukan tty), dan tr
kemungkinan buffer outputnya dengan garis karena outputnya mungkin terminal.
Tapi, karena Anda menghapus setiap karakter baris baru dari outputnya, itu tidak akan pernah menampilkan baris, jadi buffering akan dengan blok.
Jadi di sini Anda ingin menonaktifkan buffering untuk keduanya LongRunningCommand
dan tr
. Pada sistem GNU atau FreeBSD:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Perhatikan bahwa jika Anda ingin bergabung dengan garis dengan koma, pendekatan yang lebih baik adalah menggunakan paste -sd , -
. Dengan begitu output akan diakhiri oleh karakter baris baru (Anda mungkin masih perlu menonaktifkan buffering).
stdbuf
untuk LongRunningCommand atau tr, atau keduanya, berbeda?