Biasanya, stdout
buffer baris. Dengan kata lain, selama printf
argumen Anda diakhiri dengan baris baru, Anda dapat mengharapkan baris tersebut dicetak secara instan. Tampaknya ini tidak berlaku saat menggunakan pipa untuk dialihkan tee
.
Saya memiliki program C ++ a
,, yang mengeluarkan string, selalu \n
-terminasi, ke stdout
.
Ketika dijalankan dengan sendirinya ( ./a
), semuanya dicetak dengan benar dan pada waktu yang tepat, seperti yang diharapkan. Namun, jika saya menyalurkannya ke tee
( ./a | tee output.txt
), itu tidak mencetak apa pun hingga berhenti, yang mengalahkan tujuan penggunaan tee
.
Saya tahu bahwa saya dapat memperbaikinya dengan menambahkan fflush(stdout)
setelah setiap operasi pencetakan dalam program C ++. Tapi apakah ada cara yang lebih bersih dan mudah? Apakah ada perintah yang dapat saya jalankan, misalnya, yang akan memaksa stdout
menjadi buffer baris, bahkan saat menggunakan pipa?
expect
sendiri karenaunbuffer
tampaknya tidak disertakan secara default di OS X.unbuffer
hanya skrip kecil jadi Anda tidak perlu mengkompilasi ulang seluruh paket../configure && make
butuh waktu sekitar 10 detik dan kemudian saya baru saja pindahunbuffer
ke/usr/local/bin
:)unbuffer {commands with pipes/tee}
.Anda dapat mencoba
stdbuf
bagian (besar) dari halaman manual:
ingatlah ini:
Anda tidak sedang menjalankan
stdbuf
padatee
, Anda menjalankannya padaa
, jadi ini seharusnya tidak mempengaruhi Anda, kecuali Anda mengatur bufferinga
's aliran dalama
' sumber s.Juga,
stdbuf
adalah tidak POSIX, tetapi bagian dari GNU-coreutils.sumber
stdbuf
sudah tersedia di distribusi Centos Linux yang kami gunakan, danunbuffer
tidak. Terima kasih!-u
untuk menonaktifkan buffering di sisi python:python3 -u a.py | tee output.txt
Anda juga dapat mencoba untuk menjalankan perintah Anda di pseudo-terminal menggunakan
script
perintah (yang harus memaksakan keluaran yang di-buffer-baris ke pipa)!Sadarilah bahwa
script
perintah tidak menyebarkan kembali status keluar dari perintah yang dibungkus.sumber
script -t 1 /path/to/outputfile.txt ./a
bekerja dengan baik untuk kasus penggunaan saya. Ini mengalirkan langsung semua output keoutputfile.txt
sementara juga mencetaknya ke stdout shell Anda. Tidak perlu menggunakantee
Anda dapat menggunakan setlinebuf dari stdio.h.
Ini harus mengubah buffering menjadi "line buffered".
Jika Anda membutuhkan lebih banyak fleksibilitas, Anda dapat menggunakan setvbuf.
sumber
setvbuf(stdout, NULL, _IOLBF, 0)
, yang persis sama.Jika Anda menggunakan kelas aliran C ++, every
std::endl
adalah pembilasan implisit. Menggunakan pencetakan gaya-C, saya rasa metode yang Anda sarankan (fflush()
) adalah satu-satunya cara.sumber
#include <iostream> #include <unistd.h> int main(void) { std::cout << "1" << std::endl; sleep(1); std::cout << "2" << std::endl; }
. endl selalu membersihkan buffer seperti yang didefinisikan di sini: en.cppreference.com/w/cpp/io/manip/endl