Perintah tee Linux: tampilkan dan simpan keluaran pipeline

Perintah tee menyalin masukan standar ke keluaran standar sekaligus menulis salinan yang sama ke satu atau beberapa berkas. Gunakan tee untuk melihat keluaran sambil menyimpannya, atau untuk mencatat data di tengah pipeline. Secara bawaan, berkas tujuan ditimpa; gunakan -a untuk menambahkan data di bagian akhirnya.

Pipeline adalah rangkaian perintah yang dihubungkan dengan simbol |. Berbeda dari pengalihan > yang langsung mengarahkan keluaran ke berkas, tee tetap meneruskan data ke keluaran standarnya. Jika masih ada perintah setelah tee, data diterima perintah itu; tampilan terminal kemudian bergantung pada keluaran perintah terakhir.

Sintaks dasar

KOMANDO | tee [OPSI]... BERKAS [BERKAS]...

KOMANDO, OPSI, dan BERKAS adalah penanda yang perlu diganti. Tee membaca data dari pipa pada contoh ini. Setiap nama berkas merupakan tujuan penulisan, dan berkas yang belum ada akan dibuat jika jalur serta izin mengizinkannya. Tanpa argumen berkas, tee tetap menyalin masukan ke keluaran standar.

Contoh berikut memakai GNU tee. Periksa tee --version, tee --help, dan man tee karena opsi tertentu, termasuk penanganan kesalahan pipa, bergantung pada implementasi.

Contoh melihat dan menyimpan keluaran

Gunakan direktori latihan kosong agar nama berkas contoh tidak menimpa data penting. Semua tujuan dalam contoh dibuat di direktori kerja saat ini, kecuali jika Anda memberi jalur lain.

Tampilkan dan simpan waktu saat ini

date | tee run-time.txt

Waktu dari date terlihat di terminal dan isi yang sama disimpan ke run-time.txt. Nilai, zona waktu, dan format tanggal mengikuti lingkungan sistem Anda. Jika run-time.txt sudah berisi catatan lama, pemanggilan ini menggantinya. Periksa dengan cat run-time.txt.

Tambahkan ke catatan yang sudah ada

date | tee -a run-time.txt

Waktu baru ditambahkan setelah isi lama, sambil tetap ditampilkan di terminal. Setelah menjalankan contoh sebelumnya lalu contoh -a sekali, berkas berisi dua baris hasil date. Mengulang -a terus menambah catatan; opsi ini tidak menghapus catatan yang sama atau mencegah duplikasi.

Simpan hasil antara lalu tampilkan bagian awalnya

Siapkan names.txt dengan printf 'Budi\nAna\nCici\n' > names.txt. Perintah ini menimpa names.txt jika sudah ada. Kemudian jalankan:

sort names.txt | tee -p names.sorted | head

Untuk data latihan, terminal menampilkan Ana, Budi, lalu Cici pada tiga baris. Names.sorted menyimpan hasil sort, sedangkan head hanya menampilkan hingga sepuluh baris pertama secara bawaan. Panduan sort menjelaskan aturan urutan dan locale yang memengaruhi hasilnya.

Opsi -p GNU tee penting ketika pembaca berikutnya, seperti head, berhenti sebelum seluruh data habis. Tanpa penanganan yang sesuai, kesalahan menulis ke pipa yang sudah tertutup dapat menghentikan tee dan membuat salinan berkas tidak lengkap. Dengan -p, tee dapat melanjutkan penulisan ke tujuan yang masih terbuka, termasuk names.sorted. Ini tidak mengatasi kegagalan lain seperti ruang penyimpanan habis atau izin tulis yang ditolak.

Contoh dengan hasil yang tetap

printf 'status=ok\n' | tee result.txt

Terminal menampilkan keluaran berikut, dan result.txt menyimpan satu baris yang sama:

status=ok

Baris baru dari printf ikut disalin. Untuk membuat salinan di dua tujuan sekaligus, coba printf 'status=ok\n' | tee copy-a.txt copy-b.txt. Kedua berkas berisi data yang sama, dan tee tetap mengirimkannya ke terminal. Periksa hasil sebelum memakai perintah serupa pada jalur penting.

Opsi yang sering dipakai

Opsi Kegunaan dan batasnya
-a Tambahkan data ke akhir berkas tujuan, bukan menimpa isi lama.
-i Abaikan sinyal interupsi; bukan berarti mengabaikan semua kesalahan.
-p Pada GNU tee, tangani penutupan pembaca pipa agar tujuan lain yang masih terbuka dapat terus ditulis.

Jika hanya ingin menyimpan berkas tanpa menampilkan salinan tee di terminal, arahkan keluaran standarnya, misalnya printf 'status=ok\n' | tee quiet.log > /dev/null. Data tetap masuk quiet.log. Pengalihan ini tidak otomatis menyembunyikan keluaran kesalahan yang masih dikirim ke stderr.

Keluaran kesalahan dan status pipeline

Gabungkan stderr jika memang perlu disimpan

Masukan tee biasanya berasal dari stdout, yaitu keluaran standar perintah sebelumnya. Stderr, yaitu saluran keluaran kesalahan, tidak otomatis masuk ke pipa yang sama. Contoh latihan Bash berikut sengaja membuat satu baris pada masing-masing saluran: bash -c 'printf "out\n"; printf "err\n" >&2' 2>&1 | tee combined.log. Terminal dan combined.log menerima out lalu err pada dua baris.

Pengalihan 2>&1 ditempatkan pada perintah penghasil data, sebelum pipa menuju tee. Menambahkannya hanya pada tee tidak menangkap stderr dari perintah sebelumnya. Tinjau isi keluaran sebelum mencatatnya; pesan kesalahan dan keluaran biasa dapat memuat data yang tidak ingin Anda tampilkan atau simpan.

Periksa kegagalan penghasil data juga

Secara bawaan di Bash, status pipeline mengikuti perintah terakhir. Karena itu, penghasil data bisa gagal sementara tee berhasil menulis data kosong atau parsial. Untuk percobaan terpisah tanpa mengubah opsi shell utama, (set -o pipefail; false | tee failed.log) selesai dengan status 1. False sengaja gagal; failed.log dapat tetap dibuat sebagai berkas kosong.

Pipefail membuat status pipeline menunjukkan kegagalan salah satu tahap, tetapi tidak menghapus hasil parsial atau membatalkan penulisan berkas. Periksa status dan kelengkapan keluaran sebelum menganggap catatan berhasil dibuat. Opsi -p dan pipefail menangani persoalan berbeda: -p mengatur kesalahan keluaran tee, sedangkan pipefail mengatur status rangkaian perintah Bash.

Izin tulis dan berkas masukan

Redireksi shell memakai izin shell saat ini

Pola seperti sudo KOMANDO > BERKAS dapat gagal ketika shell saat ini tidak mempunyai izin membuka BERKAS, karena > diproses oleh shell. Bila memang berwenang menulis tujuan tersebut, pola KOMANDO | sudo tee BERKAS menjalankan proses penulisnya dengan izin administrator. KOMANDO dan BERKAS pada penjelasan ini adalah penanda, bukan perintah yang langsung dijalankan.

Sudo pada tee tidak otomatis memberi hak tambahan kepada perintah di sebelah kiri pipa. Tee juga tetap menampilkan salinan data ke stdout kecuali Anda mengarahkannya ke tempat lain. Pastikan tujuan, mode timpa atau tambah, dan hak akses sesuai sebelum menulis berkas yang dikelola administrator.

Jangan menulis kembali ke sumber yang sedang dibaca

Gunakan nama tujuan terpisah, seperti names.sorted pada contoh. Membaca suatu berkas melalui pipeline sambil memakai tee untuk menimpa jalur yang sama dapat merusak atau memotong data. Tee bukan penyunting berkas langsung dan tidak menjamin penggantian berkas secara atomik.

FAQ

Apakah tee otomatis menyimpan stderr?

Tee hanya menyalin data yang diterimanya melalui masukan standar. Jika perlu mencatat stdout dan stderr dari penghasil data, gabungkan kedua saluran pada penghasil tersebut sebelum pipa, misalnya dengan 2>&1 di Bash, lalu periksa status pipeline dan hasil catatannya.

Dokumentasi

Penanganan kesalahan keluaran dijelaskan dalam manual GNU tee yang ditayangkan di man7. Aturan pengalihan dan status pipefail tersedia pada manual GNU Bash yang ditayangkan di man7.