GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Membuat Program Apa Pun Bekerja Dengan Perintah Tee?

Saya menulis sebuah program (dalam Ruby) dan itu bekerja dengan baik. Ini mencetak beberapa baris teks dan kemudian berhenti selama satu menit dan kemudian mengulangi yang di atas.

Ini berfungsi dengan baik (di terminal Mac OS X), tetapi saya mencatat bahwa jika saya ingin menyimpan catatan keluaran, dengan menggunakan

ruby myscript.rb | tee record.txt

maka output tidak akan ditampilkan di layar, sampai output mencapai jumlah tertentu, mungkin beberapa kb. Namun, ini bisa berarti 5 atau 10 menit tanpa apa pun di layar (dan juga tidak ada apa pun di file jika saya menekan CTRL-C).

Saya dapat memodifikasi program untuk menyiram output, tetapi saya pikir aplikasi harus agnostik tentang apa yang digunakan dengan output ke STDOUT. Begitu juga tee dibuat berfungsi dengan baik (mungkin dengan opsi), atau perintah lain apa pun dapat digunakan, atau mungkin itu adalah opsi Bash atau aplikasi Terminal? Apakah ada cara?

Jawaban yang Diterima:

Saya pikir aplikasi harus agnostik tentang apa yang digunakan dengan output ke STDOUT.

Anda salah berpikir. Pustaka runtime dari beberapa bahasa pemrograman, termasuk bahasa C dan C++, semuanya berbagi semantik mengubah buffering sesuai dengan apakah mereka mendeteksi bahwa aliran terpasang ke perangkat terminal.

Ini adalah bagian tertentu dari bahasa dalam banyak kasus. Standar bahasa C mengatakan, misalnya:

Saat pertama kali dibuka, aliran kesalahan standar tidak sepenuhnya disangga; input standar dan aliran output standar sepenuhnya buffer jika dan hanya jika aliran dapat ditentukan untuk tidak merujuk ke perangkat interaktif.

Pilihan yang biasa jika aliran tidak terpasang ke perangkat terminal adalah untuk memilih buffering unit, buffering baris, atau buffering penuh. Buffer unit dan buffering baris biasa terjadi untuk kesalahan standar; buffering penuh untuk output standar. Tapi ini berbeda menurut bahasa.

Jadi untuk mendapatkan keluaran agar tidak sepenuhnya disangga ketika aliran keluaran adalah pipa dalam bahasa seperti itu, Anda harus

  • tulis program Anda sendiri untuk membuat jalur keluaran standar buffered, smart buffered, atau unbuffered;
  • gunakan hal-hal yang mengaitkan perpustakaan runtime bahasa pemrograman Anda, seperti stdbuf perintah jika bahasa pemrograman Anda adalah C atau menggunakan (bagian aliran I/O dari) pustaka runtime C sebagai basisnya (yang tidak dimiliki oleh beberapa bahasa pemrograman); atau
  • gunakan alat seperti ptybandage yang membuat program berpikir bahwa keluaran standarnya adalah terminal, sementara mengambil keluaran tersebut dan mengirimkannya ke ujung tulis pipa.
Terkait:Bagaimana sebuah program memutuskan apakah akan memiliki keluaran berwarna atau tidak?

Bacaan lebih lanjut

  • https://unix.stackexchange.com/a/249801/5132

Linux
  1. Bagaimana Cara Membuat Iconv Mengganti File Input Dengan Output yang Dikonversi?

  2. Bagaimana Perintah Keluar Bekerja Pada Terminal Unix?

  3. Bagaimana cara menambahkan output ke file?

  1. Cara mengaudit izin dengan perintah find

  2. Bagaimana opsi '-s', '-t', dan '-c' dari perintah tr bekerja di Unix?

  3. Bagaimana cara kerja perintah ps?

  1. Cara menangkap sesi terminal dan output dengan perintah skrip Linux

  2. Bagaimana Cara Menetapkan Output Perintah Ke Variabel Shell?

  3. Menutup Output Standar (>&-)?