Có bất kỳ ý nghĩa để sử dụng tee?


47

Tại sao gần như tất cả các hướng dẫn liên quan đến việc thêm văn bản vào các tệp hệ thống như fstab/etc/apt/sources.list.d/<name>.listliên quan đến việc sử dụng tee echo nối thêm văn bản đã nói?

Lấy các ví dụ sau, được chạy dưới quyền 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

Chạy diff -u file1 file2không trả về gì cả; chạy md5sum file1 file2cho thấy tổng kiểm tra của họ là giống hệt nhau, điều này đưa tôi trở lại câu hỏi ban đầu của tôi:

Tại sao | tee <FILENAME>phổ biến trên các tài liệu Ubuntu, nó chỉ là thực hành tốt, nếu không, sẽ không dễ dàng hơn khi chỉ sử dụng ví dụ 2 thay vì chuyển đầu ra từ echosang tee?


1
Bạn đang thiếu sudo trong các lệnh của bạn; điều đó sẽ hiển thị các kết quả khác nhau giữa 2;)
Rinzwind

1
@Rinzwind Tôi đang chạy các lệnh này với quyền root.
Alexej Magura

Câu trả lời:


83

Có một sự khác biệt: tee nhân đôi đầu ra: nó gửi cả tệp đến tệp và hiển thị.

Nhưng có nhiều hơn:

  • Ví dụ: nếu bạn muốn viết một số chuỗi thành hai tệp cùng một lúc, lệnh với tee bạn có thể sử dụng là:

     echo "some text" | tee file1 > file2  
    
  • Một điều khác tee có thể giúp bạn là tránh một vấn đề khi sử dụng sudo. Toán tử chuyển hướng đầu ra bình thường luôn được thực thi với các đặc quyền người dùng của bạn, cũng như khi bạn viết sudo trước lệnh tạo ra văn bản STDOUT. Nói cách khác, điều này sẽ thất bại nếu bạn không có quyền ghi vào tệp đó:

     sudo echo "something" > bar  
    

    Nhưng với tee, mọi thứ sẽ diễn ra tốt đẹp:

    echo "something" | sudo tee bar  
    

2 ví dụ từ trang web này . Nó có thêm một số.


Bạn có thể sudokhông có tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf

7
@wilf yeah, nhưng khi bạn cần xuất báo giá ", mọi thứ trở nên lộn xộn
Braiam

3
Trong trường hợp đầu tiên, nếu bạn muốn ghi vào N tệp, tôi sẽ thích echo "some text" | tee file1 file2 ... fileNvà có thể nối thêm > /dev/null, nếu bạn không muốn lộn xộn trên thiết bị xuất chuẩn.
Elmar Zander

Một người đẹp @ElmarZander :)
Rinzwind

13

teelấy luồng đầu vào tiêu chuẩn và ghi nó vào cả luồng đầu ra tiêu chuẩn cũng như luồng tệp. Nếu nó giúp mọi người ghi nhớ, tên lệnh xuất phát từ bộ chia T trong hệ thống ống nước. Có một bài viết Wikipedia rất hay , nơi tôi đã tìm hiểu về nguồn gốc của tên lệnh.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


11

Trước hết, teebản thân nó không nối thêm văn bản, cũng không >.

Đó là tee -avà bổ sung của nó, >>văn bản APPENDS.

Tôi không tin tất cả các shell hỗ trợ >>chức năng, vì vậy đó là lý do tại sao teeđược sử dụng phổ biến hơn. (Hãy nghĩ về chỉ đơn giản là cũ sh). Tee là một lệnh, trong khi >>là một nhà điều hành.

Nếu bạn sử dụng (yêu thích cá nhân của tôi) bash, >>>đẹp hơn / dễ dàng hơn nhiều.

Việc sử dụng teecũng cho phép bạn sudo JUST lệnh đó để bạn không phải sudo toàn bộ câu lệnh, như trong sudo sh -c "echo foo > bar". teecũng cho phép bạn phân chia đầu ra. Tất nhiên, tất cả những điều này có thể được nhìn thấy trong man tee. Nó chủ yếu chỉ là sở thích cá nhân của bạn.

Để đọc thêm, xem ở đâyở đây .


5
Làm rõ về "sudo JUST that lệnh", đối với bất kỳ ai thấy điều này hơi phức tạp: sử dụng một hình thức như sudo somecommand >> fileasẽ chạy sudo somecommandvà sau đó, khi người dùng gọi , nối thêm đầu ra filea. Sử dụng sudo sh -c "somecommand >> filea"các tác phẩm, nhưng có thể gây ra những cơn ác mộng lồng nhau. Sử dụng somecommand | sudo tee -a fileachạy somecommandnhư người dùng gọi, và sau đó nối đầu ra thành filearoot - thường là những gì người dùng muốn.
Darael

@Darael Tôi đã chỉnh sửa bài viết. Cảm ơn bạn đã làm rõ.
Kaz Wolfe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.