Apakah ada pentingnya menggunakan tee?

47

Mengapa hampir semua instruksi tentang menambahkan teks ke file sistem suka fstabdan /etc/apt/sources.list.d/<name>.listmelibatkan penggunaan tee dan echo untuk menambahkan teks tersebut?

Ambil contoh berikut, yang dijalankan sebagai root :

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

Menjalankan diff -u file1 file2tidak menghasilkan apa-apa; menjalankan md5sum file1 file2show checksum mereka identik, yang membawa saya kembali ke pertanyaan awal saya:

Mengapa | tee <FILENAME>begitu lazim di seluruh dokumen Ubuntu, apakah ini hanya praktik yang baik, jika tidak akan lebih mudah untuk hanya menggunakan contoh 2 daripada melewati output dari echoke tee?

Alexej Magura
sumber
1
Anda melewatkan sudo dalam perintah Anda; yang akan menunjukkan hasil yang berbeda antara 2;)
Rinzwind
1
@Rinzwind Saya menjalankan perintah ini sebagai root.
Alexej Magura

Jawaban:

84

Ada perbedaan: tee menduplikasi output: ia mengirimkannya ke file dan ke tampilan.

Tetapi ada lagi:

  • Misalnya, jika Anda ingin menulis beberapa string menjadi dua file sekaligus, perintah dengan tee yang dapat Anda gunakan adalah:

     echo "some text" | tee file1 > file2  
    
  • Tee lain yang bisa membantu Anda adalah menghindari satu masalah saat menggunakan sudo. Operator pengalihan output normal selalu dijalankan dengan hak pengguna Anda, juga ketika Anda menulis sudo di depan perintah yang menghasilkan teks STDOUT. Dengan kata lain, ini akan gagal jika Anda tidak memiliki izin untuk menulis ke file itu:

     sudo echo "something" > bar  
    

    Tapi dengan tee, semuanya akan berjalan dengan baik:

    echo "something" | sudo tee bar  
    

2 contoh dari situs ini . Ada lagi.

Rinzwind
sumber
Anda dapat sudotanpa tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf
7
@wilf ya, tetapi ketika Anda perlu menampilkan kutipan ", semuanya menjadi berantakan
Braiam
3
Dalam kasus pertama, jika Anda ingin menulis ke file N, saya lebih suka echo "some text" | tee file1 file2 ... fileNdan mungkin menambahkan > /dev/null, jika Anda tidak ingin kekacauan di stdout.
Elmar Zander
Nice @ElmarZander :)
Rinzwind
13

teemengambil masukan standar dan menulis ke kedua output stream standar serta file streaming. Jika itu membantu orang mengingat, nama perintah berasal dari T-splitter dalam pipa ledeng. Ada artikel Wikipedia yang bagus di mana saya belajar tentang asal usul nama perintah.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

pengguna391339
sumber
11

Pertama-tama, teeitu sendiri tidak menambahkan teks, juga tidak >.

Ini tee -adan pelengkapnya, >>bahwa teks LAMPIRAN.

Saya tidak percaya semua shell mendukung >>fungsinya, jadi itu sebabnya teelebih umum digunakan. (Pikirkan tua saja sh). Tee adalah perintah, sedangkan >>operator.

Jika Anda menggunakan (favorit pribadi saya) bash, >dan >>jauh lebih baik / lebih mudah.

Menggunakan teejuga memungkinkan Anda untuk sudo HANYA perintah itu sehingga Anda tidak perlu sudo seluruh pernyataan, seperti pada sudo sh -c "echo foo > bar". teejuga memungkinkan Anda untuk membagi output. Tentu saja, semua ini bisa dilihat di man tee. Ini terutama hanya preferensi pribadi Anda.

Untuk bacaan lebih lanjut, lihat di sini dan di sini .

Kaz Wolfe
sumber
5
Klarifikasi pada "sudo JUST that command", bagi siapa pun yang menemukan ini sedikit rumit: menggunakan formulir seperti sudo somecommand >> fileaakan berjalan sudo somecommanddan kemudian, sebagai pengguna yang memanggil , tambahkan hasilnya ke filea. Menggunakan sudo sh -c "somecommand >> filea"karya, tetapi dapat menyebabkan mimpi buruk yang bersarang-kutip. Menggunakan somecommand | sudo tee -a fileamenjalankan somecommandsebagai pengguna yang memanggil, dan kemudian menambahkan output fileasebagai root - yang biasanya apa yang diinginkan pengguna.
Darael
@ Darel saya mengedit posting. Terima kasih telah membuat klarifikasi.
Kaz Wolfe