`unbuffer` atau` stdbuf` untuk menghapus buffering stdout?

13

Apakah ada perbedaan antara unbuffer (1) dan stdbuf (1)? Dari apa yang saya kumpulkan, unbuffer membuat lebih dari "upaya terbaik" memanggil fungsi libc set (X) di awal, dan membiarkan semuanya terjadi?

dan3
sumber

Jawaban:

14

Mereka bekerja dengan cara yang sangat berbeda.

Penggunaan unbuffer program berharap untuk menjalankan perintah yang disebutkan. Karena mengharapkan membuat pseudo-tty untuk dilampirkan pada proses stdout anak, anak mungkin tertipu dengan berpikir bahwa ia harus menggunakan buffer-line daripada buffer-blocking. Beberapa program akan mengubah perilaku mereka ketika isatty (stdout) benar, yang lain tidak dan sangat sulit untuk mengetahui mana yang mau dan yang tidak.

Program stdbuf mencoba meletakkan libstdbuf di depan libc untuk binari yang dimuat secara dinamis. Di mana libstdbuf mendefinisikan kembali strategi buffering standar dari panggilan libc stdio.

Saya menemukan ini oleh

 apt-get source expect coreutils

dan membaca sumber yang relevan untuk setiap program.

msw
sumber
Beberapa hal yang mengkhawatirkan (dari halaman manual): unbuffer -pmungkin tampak tidak berfungsi dengan benar jika proses input input ke unbuffer keluar. Pertimbangkan: process1 | unbuffer -p process2 | process3Jika process1 keluar, process2 mungkin belum selesai. Mustahil bagi orang yang tidak tahu harus menunggu lama untuk menunggu
dan3
Tampaknya stdbuf juga dapat mengontrol buffering stdin dari program yang menggunakan stream C, yang tampaknya penting. Mungkin ini harus dimasukkan dalam jawaban untuk kepentingan pembaca masa depan.
dan3