Semua penggunaan yang tee
pernah saya lihat adalah seperti:
do_something | tee -a logfile
Atau:
do_something_else | tee logfile
Apakah tee
diciptakan untuk mereka yang tidak tahu Anda dapat melakukan hal yang sama dengan pengalihan pipa shell? Seperti:
do_something >> logfile
Atau:
do_something_else > logfile
Ini praktis sama dan membutuhkan lebih sedikit hit keyboard untuk mengetik. Fitur tersembunyi apa yang tidak saya lihat tee
?
tee
dan pengalihan I / O ? Fakta bahwa ia mengatakan " pengalihan pipa shell seperti dan " bukanlah hal yang menguntungkannya, dan merupakan argumen untuk menutup sebagai tidak jelas. Tapi itu sebenarnya mengajukan beberapa pertanyaan: "Apa tujuan dari ?", " Diciptakan untuk mereka yang tidak tahu Anda bisa melakukan hal yang sama dengan pengalihan pipa shell?" Dan "Fitur tersembunyi apa yang tidak saya lihat ?". Setidaknya dua dari pertanyaan itu terlalu luas.>
>>
tee
tee
tee
Jawaban:
Apa yang tidak Anda lihat adalah yang
do_something | tee -a logfile
menempatkan output kelogfile
dan ke stdout, sementarado_something >> logfile
menempatkannya hanya ke dalam file log.Tujuannya
tee
adalah untuk menghasilkan satu input, skenario banyak keluaran - sama seperti dalam persilangan 'T'.SUNTING
Ada komentar tentang bagaimana
tee
memungkinkan penggunaan yang lebih tidak terlihatsudo
. Ini adalah intinya:cat
,dd
atau mungkin lebih baikbuffer
memberikan kemungkinan ini dengan kinerja yang lebih baik, jika Anda tidak perlu beberapa output. Gunakantee
untuk apa yang dirancang, bukan untuk apa yang "juga bisa dilakukan"sumber
tee
bahkan dapat mengambil beberapa argumen dan menulis ke banyak file sekaligus.cat
dengan cara yang langsung daripadatee
di misalnyaecho /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern
?echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern
tidak berfungsi, karena pengalihan diproses oleh shell non-sudo. Adapundd
,echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_pattern
bekerja, tetapidd
sering merupakan alat yang dikuasai mampu melakukan kerusakan besar, terutama di bawahsudo
. Adapunbuffer
, itu tidak diinstal secara default di salah satu distro RedHat- atau Ubuntu saya harus menyerahkan (atau MacOS) ...cat
atau/bin/cat
bekerja untuk saya dalam situasi ini. Tidak masalah dari manacat
asalnya ->
masih akan ditangani oleh shell tingkat atas (non-sudo). Keuntungan daritee
lebihcat
dalam situasi ini adalah memungkinkan file output untuk dilewatkan sebagai param baris perintah (dan bukan redirect).dd
tentu saja merupakan opsi yang layak, meskipun saya masih mendukungtee
inicat
dantee
sebagai builtin? Dan versi apa yangsudo
bisa menjalankan shell builtins?Tee
tidak sia-siaMungkin Anda tahu itu? Jika tidak, baca terus! Atau jika Anda tahu cara kerjanya, tetapi tidak yakin mengapa itu ada, lewati sampai akhir untuk melihat bagaimana itu cocok dengan filosofi Unix.
Apa adalah tujuan
tee
?Paling sederhana, dibutuhkan data pada input standar dan menuliskannya ke output standar dan satu (atau lebih) file. Itu telah disamakan dengan sepotong tee pipa dengan cara membagi satu input menjadi dua output (dan dua arah).
Contohnya
Mari kita ambil contoh pertama Anda:
Ini mengambil output dari
do_something
dan menambahkannya ke file log, sementara juga menampilkannya kepada pengguna. Faktanya, halaman Wikipediatee
memiliki ini sebagai contoh kedua:Contoh berikutnya memiliki kegunaan lain: peningkatan izin :
Atau mungkin Anda ingin mengambil output dari satu perintah, menulis di suatu tempat dan juga menggunakannya sebagai input ke perintah lain?
(kredit untuk contoh penggunaan perintah Tee )
Tee
bekerja dengan filosofi Unix:(Kredit untuk Dasar-dasar Filsafat Unix )
tee
cocok untuk semua ini:sumber
sudo tee -a
mungkin adalah inovasi yang lebih baru (saya pertama kali melihatnya di Ubuntu panduan / wiki terutama untuk pengaturan hal-hal di/proc/sys
, karena beralih ke Ubuntu adalah ketika saya beralih kesudo
sistem berbasis (bagaimana Ubuntu dikonfigurasi secara default) daripada menggunakansu
dengan kata sandi root). Saya pikirtee
mendahuluisudo
, sehingga tidak alasan untuktee
ada. Anda tidak perlutee
untuk itu, itu hanya lebih pendek untuk mengetik secara interaktif daripadasudo sh -c 'cat > output'
.tee
memberi makan dua pipa, sepertifoo | tee >(pipe2) | pipe1
. Atau kesenangan lainnya adalahffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.log
melihat pembaruan baris status secara interaktif di tty, sambil menghapus "garis" yang berakhir dengan carriage-return alih-alih baris baru untuk logging aktual. (Yaitu menyaring pembaruan baris status). Secara umum, Anda dapat menempeltee /dev/tty
di mana saja dalam pipa sebagai debug-cetak.>
dan mengatur redirection bahkan sebelum sudo mengertiexec
, jadi pasti bukan batasan sudo yang tidak menangani hal-hal yang tidak pernah dilihatnya. :) Saya biasanya mencoba menyebut ini sebagai "alur kerja sudo" atau istilah serupa ketika saya menjelaskannya, daripada menggambarkan sudo itu sendiri.sudo tee -a
adalah IMHO penyalahgunaan tee. Gunakansudo cat
,sudo dd
atau (dengan kinerja terbaik dalam banyak kasus)sudo buffer
jika Anda tidak membutuhkan banyak output.Sama sekali tidak sama ...
Berikut ini tampaknya agak setara, tetapi tidak:
Perbedaan kritis adalah bahwa yang pertama telah menulis data hanya ke file yang bernama, sedangkan yang terakhir telah menulis
hi
ke terminal (stdout
) dan file bernama, seperti yang ditunjukkan di bawah ini:tee
memungkinkan Anda untuk menulis data ke file dan menggunakannya dalam pipa selanjutnya, memungkinkan Anda untuk melakukan hal-hal yang berguna - seperti menyimpan data dari jalur pipa:Atau, Anda dapat menulis ke file dengan privilege yang ditinggikan, tanpa memberikan seluruh pipeline privilege yang ditinggikan (di sini
echo
dijalankan sebagai pengguna, sambiltee
menulis ke file sebagairoot
):Dengan
tee
, Anda dapat menulis ke banyak file ( danstdout
):Juga dimungkinkan untuk digunakan
exec
dengantee
merekam semua output skrip ke file, sementara masih memungkinkan pengamat (stdout
) untuk melihat data:sumber
exec > >(tee "$LOGFILE") 2>&1
dalam skrip bash yang memungkinkan skrip menampilkan stdout dan stderr untuk keduanya, stdout dan file yang ditunjuk oleh$LOGFILE
.2>&1
untuk melepaskan output dan berbuat salah untuk file txt di windows.Ini adalah tee:
Fitting pipa berbentuk T. Ini memiliki saluran masuk, dan dua outlet terpisah.
Dengan kata lain, itu membagi satu pipa menjadi dua; seperti garpu di jalan.
Demikian pula,
tee
adalah pipa (|
) yang memungkinkan Anda untuk mengarahkan input standar Anda ke dua output terpisah.Contoh
Katakanlah misalnya, Anda mengetik
ls /
.Anda akan mendapatkan output yang terlihat seperti:
Redirect output ke file teks
ls / > ls.txt
,, dan tidak ada output ditampilkan di shell, hanya di file teks yang dihasilkan.Ingin melihat hasilnya, DAN meneruskannya ke file teks pada saat yang sama?
Tambahkan
tee
ke pipa Anda (|
) yaitu:ls / | tee ls.txt
Bandingkan keduanya:
sumber
Tidak. Anda menyebutkan salah satu dari beberapa contoh di mana Anda memang dapat mengarahkan ulang ke file menggunakan
>
dan>>
operator.Tapi Tee bisa berbuat lebih banyak. Karena Anda menyalurkan ke sana, Anda kemudian dapat menyalurkan ke yang lain.
Contoh yang bagus tercantum di halaman wikipedia :
Pada dasarnya, Anda dapat menyalurkan ke Tee, sehingga Anda dapat menyalurkan dari Tee ke yang lain. Jika semua yang ingin Anda lakukan adalah menulis file log, ya, maka Anda tidak benar-benar membutuhkan Tee.
sumber
tee
jauh dari tidak berguna. Saya menggunakannya sepanjang waktu dan senang itu ada. Ini adalah alat yang sangat berguna jika Anda memiliki pipa yang ingin Anda pisahkan. Contoh yang sangat sederhana adalah bahwa Anda memiliki beberapa direktori$d
yang ingin Anda tar dan Anda juga ingin menggunakannya karena Anda paranoid (seperti saya) dan tidak percaya media penyimpanan untuk menyimpan data dengan andal. Anda dapat menulisnya ke disk terlebih dahulu lalu hash, tetapi itu akan gagal jika arsip rusak sebelum hash. Selain itu, Anda harus membacanya dan jika Anda mengerjakan banyak file dengan ukuran beberapa ratus GB, Anda akan tahu bahwa Anda benar-benar tidak ingin membacanya lagi jika tidak harus.Jadi yang saya lakukan hanyalah ini:
Itu menciptakan bola tar dan pipa itu ke tee yang kemudian pipa itu ke dua sub-shell, di mana satu hash dan yang lain itu ditulis ke disk.
Ini juga bagus jika Anda ingin melakukan beberapa operasi pada file besar:
Membaca file sekali, hash (sehingga Anda dapat memeriksa apakah masih seperti seharusnya), mengekstraknya, dan menyalinnya ke lokasi yang berbeda. Tidak perlu membacanya tiga kali untuk itu.
sumber
tee
tidak membuat subkulit; shell panggilan berjalansha5sum
dancat
dan menghubungkan output mereka ke file deskriptor yang diteruskantee
. Juga, penggunaan yang tidak bergunacat
; Anda dapat menggunakan pengalihan input untuktee
membaca langsung darifile.tar.gz
.cat
Apakah cinta.cat
adalah kehidupan.< file.tar.gz tee >(sha256sum) ...
jika Anda khawatir tentang urutan leksikal dari pengalihan. Itu tidak mengubah fakta bahwa tidak perlu untuk proses yang sepenuhnya terpisah hanya untuk memberi makan satu filetee
.cat
relatif rendah. Biaya tambahan 100 GiB panggilan sistem baca + baca pasti membuang waktu CPU dan bandwidth memori ekstra untuk contoh file besar yang Anda usulkan. Ingat bahwa bandwidth memori adalah sumber daya bersama di semua inti, belum lagi polusi tambahan dari cache L3 dari penyalinan itu. Pada x86 dengan mitigasi Specter + Meltdown diaktifkan, panggilan sistem lebih mahal daripada sebelumnya. Anda menggunakan jumlah waktu ekstra CPU yang terukur selama salinan itu. Juga>(cat > foo)
tidak lebih mudah dipahami daripadafoo
, IMO.Nitpick pada jawaban @ bertieb yang mengatakan Contoh ini menunjukkan tee digunakan untuk mem-bypass batasan bawaan pada perintah sudo. sudo tidak dapat menyalurkan output standar ke file.
Tidak ada batasan yang melekat, hanya kesalahpahaman tentang bagaimana perintah diproses.
Contoh:
sudo echo 0 > /proc/sys/net/ipv4/ip_forward
The shell saat mem-parsing baris perintah. Ia menemukan pengalihan output dan melakukan itu. Kemudian ia mengeksekusi perintah, yang merupakan
sudo
dan menyediakan baris perintah yang tersisa sebagai argumen untuk perintah yang dieksekusi. Jika shell saat ini tidak memiliki izin root, maka redirection output akan gagal.echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
Ini berfungsi karena redirection output ditangguhkan ke
tee
perintah, yang pada saat itu memang memiliki izin root karena dieksekusi melaluisudo
.sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
Ini berfungsi karena shell yang melakukan pengalihan memiliki izin root.
sumber
sudo
untuk perintah itu, tetapi tidak untuk file yang menjadi output dan pengalihan berfungsi dengan baik:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Seperti orang lain telah sebutkan, piping output ke
tee
perintah menulis bahwa output ke file dan stdout.Saya sering menggunakan
tee
ketika saya ingin menangkap output dari perintah yang membutuhkan waktu lama untuk dijalankan, sementara juga ingin memeriksa output secara visual saat perintah membuatnya tersedia. Dengan begitu, saya tidak harus menunggu perintah selesai berjalan sebelum saya memeriksa hasilnya.Apa yang tampaknya belum disebutkan (kecuali saya melewatkannya), adalah bahwa
tee
perintah itu juga dapat menulis ke beberapa file sekaligus. Sebagai contoh:akan menulis semua
*.png
file dalam direktori saat ini ke dua file yang berbeda (a.txt
danb.txt
) sekaligus.Bahkan, Anda dapat mengetik teks ke beberapa file berbeda sekaligus dengan
tee
seperti ini:sumber
Penggunaan tee yang paling umum adalah untuk melihat teks pada terminal pada saat yang sama saat Anda mengirimnya ke file (atau file). Kata-kata dari pertanyaan Anda menganggap Anda hanya pernah menulis teks ke file log. Saya memiliki skrip yang menulis daftar nama file atau nama direktori untuk memicu file (untuk diproses oleh skrip lain secara tidak serempak) dan saya menggunakan tee untuk mengirim konten yang sama ke stdout. Semua stdout diarahkan ke log. Jadi saya punya teks di mana saya inginkan dan saya memiliki catatan entri log yang saya lakukan ini, semua dari satu pernyataan 'gema'
tee juga merupakan metode terbaik di Unix untuk membuat banyak file yang identik. Saya menggunakannya sesekali untuk membuat beberapa file kosong, seperti ini ...
sumber
touch
? (lebih jelas apa yang terjadi)touch
tidak akan memotong file jika sudah ada tetapi hanya memperbarui stempel waktu dan membiarkan kontennya apa adanya; tetapitee
akan memotong mereka. Selain itu, melakukanrm
+touch
berbeda daritee
(pikirkan tentang hardlink dan symlink)truncate -s 0
? :-)Bayangkan, Anda ingin menulis output dari suatu perintah ke file log DAN mencetak ke stdout. Ketika Anda perlu melakukannya pada saat yang sama, maka Anda perlu
tee
.Kasus penggunaan adalah memiliki skrip build yang menulis keseluruhan build ke stdout (mis. Untuk Jenkins) tetapi hal-hal penting pada saat yang sama ke file log terpisah (untuk email ringkasan).
Anda akan benar-benar mulai hilang
tee
ketika Anda harus skrip di Windows. Tidak adatee
dan itu benar-benar menjengkelkan.sumber
tee
. Cmd tidak pernah dimaksudkan untuk skrip serius - itulah tujuan VBS. Powershell adalah alat skrip masuk baru. Memang, Cmd masih cukup kuat, tetapi alat baris perintah sangat sedikit.