Semua penggunaan dari tee
yang pernah saya lihat adalah seperti:
do_something | tee -a logfile
Atau:
do_something_else | tee logfile
Adalah tee
diciptakan untuk orang-orang yang don't tahu anda dapat melakukan hal yang sama dengan shell pipa pengalihan? Seperti:
do_something >> logfile
Atau:
do_something_else > logfile
It's hampir sama dan membutuhkan waktu kurang keyboard adalah untuk jenis. Apa fitur tersembunyi saya tidak melihat di tee
?
Apa yang anda don't see adalah bahwa do_something | tee -logfile
menempatkan output ke logfile
dan ke stdout, sementara do_something >> logfile
menempatkan hanya dalam logfile.
Tujuan dari tee
adalah untuk menghasilkan satu input, multiple output - skenario seperti di 'T' crossing.
EDIT
Ada komentar di cara tee
memungkinkan lebih seemless penggunaan sudo
. Ini adalah intinya: cat
, dd
atau mungkin lebih baik buffer
memberikan kemungkinan ini dengan kinerja yang lebih baik, jika anda don't membutuhkan beberapa output. Gunakan tee
untuk apa yang dirancang, tidak apa "juga dapat melakukan"
Tee
tidak sia-siaMungkin anda tahu bahwa toh? Jika tidak, baca terus! Atau jika anda tahu cara kerjanya, tapi tidak't yakin mengapa ada, melompat ke akhir untuk melihat bagaimana hal itu cocok dengan filosofi Unix.
tee
?Pada bentuknya yang paling sederhana, dibutuhkan data pada standar masukan dan menulis yang standar output dan satu (atau lebih) file. Telah disamakan dengan pipa tee piece dalam cara ini membagi satu input ke dua output (dan dua arah).
Let's ambil contoh pertama:
do_something | tee -a logfile
Ini mengambil output dari do_something
dan menambahkan ke logfile, sementara juga menampilkan kepada pengguna. Pada kenyataannya, halaman Wikipedia tentang tee
ini sebagai contoh kedua:
Untuk melihat dan menambahkan output dari perintah ke file yang sudah ada:
serat program.c | tee -program.serat
Ini akan menampilkan output standar dari serat program.c perintah pada komputer dan pada saat yang sama menambahkan copy dari itu untuk akhir program.serat file. Jika program ini.serat file tidak ada, itu dibuat.
Berikutnya contoh lain penggunaan: eskalasi permissions:
Untuk memungkinkan eskalasi permissions:
cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"
contoh Ini menunjukkan tee yang digunakan untuk memotong yang melekat keterbatasan dalam
sudo
command.sudo
tidak mampu untuk pipa standar output ke file. Oleh dumping standar keluar aliran ke/dev/null
, kami juga menekan cermin output di console. Perintah di atas memberikan pengguna saat ini akses root ke server melalui ssh, dengan menginstal pengguna's kunci publik ke server's kunci otorisasi daftar.
Atau mungkin anda ingin mengambil output dari satu perintah, menulis bahwa di suatu tempat dan juga menggunakannya sebagai input untuk perintah lain?
Anda juga dapat menggunakan tee perintah untuk menyimpan output dari perintah ke file dan file output yang sama sebagai input untuk perintah lain.
berikut ini perintah akan mengambil cadangan dari file crontab, dan lulus crontab file sebagai input untuk perintah sed yang akan melakukan substitusi. Setelah pergantian, itu akan ditambahkan sebagai cron job.
$ crontab -l | tee crontab-backup.txt | sed 's/lama/baru/' | crontab –
(kredit untuk Tee perintah contoh penggunaan)
Tee
bekerja dengan filosofi Unix:Menulis program yang melakukan satu hal dan melakukannya dengan baik. Menulis program untuk bekerja bersama-sama. Menulis program untuk menangani teks sungai, karena itu adalah sebuah antarmuka universal.
(Kredit untuk dasar-Dasar Filosofi Unix)
tee
cocok untuk semua ini:
It's hampir sama dan membutuhkan waktu kurang keyboard adalah untuk jenis.
Hal ini tidak sama di semua...
Berikut ini tampaknya agak setara, tetapi mereka're tidak:
$ echo "hi" > test.txt
$ echo "hi" | tee test.txt
hi
Perbedaan penting adalah bahwa mantan telah menulis data hanya nama file, sedangkan yang kedua telah menulis hi
ke terminal (stdout
) and nama file, seperti yang ditunjukkan di bawah ini:
tee
memungkinkan anda untuk menulis data ke file and menggunakannya dalam seterusnya pipa, yang memungkinkan anda untuk melakukan hal-hal yang berguna - seperti menjaga data dari setengah jalan melalui pipa:
grep '^look ' interesting_file.txt \
| tee interesting_lines.txt \
| sort
Atau, anda dapat menulis ke file dengan hak tinggi, tanpa memberikan seluruh pipa hak tinggi (di sini echo
ini dijalankan sebagai pengguna, sementara tee
menulis ke file sebagai root
):
echo 0 \
| sudo tee /proc/sys/net/ipv4/ip_forward
Dengan tee
, anda dapat menulis untuk banyak file (and stdout
):
echo "hi" \
| tee a.txt b.txt
It's juga memungkinkan untuk menggunakan exec
dengan tee
untuk merekam semua script's output ke file, sementara masih memungkinkan pengamat (stdout
) untuk melihat data-data:
exec > >( tee output.log )
Pipa berbentuk T pas. Ini memiliki inlet, dan dua outlet yang terpisah. Dengan kata lain, ia membagi satu pipa menjadi dua; seperti garpu di jalan.
Demikian pula, tee
adalah pipa (|
) yang memungkinkan anda untuk mengarahkan input standar untuk dua output yang terpisah.
Contoh
Katakanlah misalnya, anda ketik ls /
.
Anda'll mendapatkan output yang terlihat seperti:
Applications Network Users bin dev net private tmp var
Library System Volumes cores etc home opt sbin usr
Mengarahkan output ke file teks, ls / > ls.txt
, dan tidak ada output yang ditampilkan di shell, hanya dalam menghasilkan file teks.
Ingin melihat output, DAN menyebarkannya ke file teks pada saat yang sama?
Tambahkan tee
untuk pipa (|
) yaitu: ls / | tee ls.txt
Membandingkan dua:
ls / > ls.txt
ls / | tee ls.txt
No. Anda menyebutkan satu dari beberapa contoh di mana anda memang bisa mengarahkan ke file menggunakan >
dan >>
operator.
Tapi Tee dapat melakukan lebih banyak lagi. Karena anda pipa untuk itu, anda dapat kemudian pipa untuk sesuatu yang lain.
Sebuah contoh yang baik adalah yang tercantum di halaman wikipedia:
find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt
Pada dasarnya, anda dapat pipa Tee, sehingga anda dapat kemudian pipa Tee untuk sesuatu yang lain. Jika semua yang anda ingin lakukan adalah menulis file log, ya, maka anda don't benar-benar membutuhkan Tee.
tee
jauh dari sia-sia. Saya menggunakannya sepanjang waktu dan saya senang itu ada. It's alat yang sangat berguna jika anda memiliki pipa yang anda inginkan untuk berpisah. Contoh yang sangat sederhana adalah bahwa anda memiliki beberapa direktori $d
bahwa anda ingin tar dan anda juga ingin hash itu karena anda're paranoid (seperti saya) dan don't percaya media penyimpanan untuk menyimpan data andal. Anda bisa menulis ke disk pertama dan kemudian hash itu, tapi yang'd gagal jika arsip akan rusak sebelum's hash. Selain itu, anda'a harus membaca ini dan jika anda bekerja pada file yang berada beberapa ratus GB dalam ukuran banyak, anda akan tahu bahwa anda benar-benar don't ingin membacanya lagi jika itu doesn't harus.
Jadi apa yang saya lakukan adalah hanya ini:
tar -c "$d" | tee >(sha256sum) >(cat > "$d"".tar") > /dev/null
Ini menciptakan tar bola dan pipa itu untuk tee yang kemudian pipa itu untuk dua sub-kerang, di salah satu yang's hash dan di sisi lain yang's ditulis ke disk.
It's juga besar jika anda ingin melakukan beberapa operasi pada sebuah file besar:
< file.tar.gz tee >(sha256sum) >(tar -xz) /other/storage/location/file.tar.gz > /dev/null
Membaca file sekali, hash itu (sehingga anda dapat memeriksa apakah itu's masih seperti seharusnya), ekstrak, dan salinan itu ke lokasi yang berbeda. Tidak perlu membacanya tiga kali untuk itu.
Nitpick di @bertieb's jawaban yang mengatakan contoh Ini menunjukkan tee yang digunakan untuk memotong yang melekat keterbatasan dalam perintah sudo. sudo adalah mampu pipa standar output ke file.
Tidak ada yang melekat batasan, hanya kesalahpahaman tentang bagaimana perintah diproses.
Contoh:
sudo echo 0 > /proc/sys/net/ipv4/ip_forward
The saat ini shell mengurai baris perintah. Menemukan output redirection dan melakukan itu. Kemudian mengeksekusi perintah, yang merupakan sudo
dan memberikan sisa command line sebagai argumen untuk mengeksekusi perintah. Jika saat ini shell tidak memiliki akses root, maka output redirection akan gagal.
echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
Ini bekerja karena output redirection ditangguhkan ke tee
perintah, yang pada saat itu tidak memiliki akses root karena itu dieksekusi melalui sudo
.
sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
Ini bekerja karena shell melakukan pengalihan memiliki akses root.
Sebagai orang lain telah disebutkan, pipa keluaran untuk tee
perintah menulis bahwa output untuk kedua file dan ke stdout.
Saya sering menggunakan tee
ketika aku ingin menangkap output dari perintah yang membutuhkan waktu yang lama untuk berjalan, sementara juga ingin memeriksa secara visual output sebagai perintah membuatnya tersedia. Dengan cara itu, saya don't harus menunggu perintah untuk menyelesaikan berjalan sebelum aku memeriksa output.
Apa yang doesn't tampaknya telah disebutkan belum (kecuali aku rindu itu), adalah bahwa tee
perintah juga dapat menulis untuk beberapa file sekaligus. Misalnya:
ls *.png | tee a.txt b.txt
akan menulis semua *.png
file dalam direktori saat ini ke dua file yang berbeda (a.txt
dan b.txt
) sekaligus.
Pada kenyataannya, anda dapat mengetik teks yang berbeda untuk beberapa file sekaligus dengan tee
seperti ini:
$ tee --append a.txt b.txt c.txt d.txt
These lines are appended to four different files,
and are also written to stdout.
CTRL-D
Penggunaan yang paling umum dari tee adalah untuk melihat teks pada terminal pada waktu yang sama anda kirimkan ke file (atau file). Kata-kata dari pertanyaan anda menganggap anda hanya pernah menulis teks ke file log. Saya memiliki script yang menulis daftar nama file atau nama direktori untuk memicu file (yang akan diproses oleh skrip lain asynchronously) dan saya menggunakan tee untuk mengirim konten yang sama ke stdout. Semua stdout diarahkan untuk log. Jadi saya memiliki teks saya di mana saya inginkan dan saya memiliki sebuah entri log rekaman yang saya lakukan ini, semua dari satu 'echo' pernyataan
tee adalah juga metode terbaik di Unix untuk membuat beberapa file yang identik. Saya menggunakannya kadang-kadang untuk membuat beberapa file kosong, seperti ini ...
:|tee file01 file02 file03
Bayangkan, anda ingin menulis output dari perintah ke file log DAN cetak ke stdout. Ketika anda harus melakukannya di waktu yang sama, maka anda perlu tee
.
Sebuah use case adalah untuk membangun script yang menulis seluruh membangun ke stdout (misalnya untuk Jenkins) tetapi hal-hal penting pada saat yang sama untuk sebuah file log yang terpisah (untuk ringkasan email).
Anda'll benar-benar mulai hilang tee
ketika anda harus script di Windows. Tidak ada tee
dan itu benar-benar menjengkelkan.