Czy korzystanie z tee ma jakieś znaczenie?

47

Dlaczego jest to, że prawie wszystkie instrukcje dotyczące dopisywania tekstu do plików systemowych, jak fstabi /etc/apt/sources.list.d/<name>.listobejmować zastosowanie tee i echo dołączyć mówi tekst?

Weź następujące przykłady, które są uruchamiane jako 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

Bieganie diff -u file1 file2nic nie zwraca; uruchomione md5sum file1 file2pokazuje, że ich sumy kontrolne są identyczne, co przywraca moje pierwotne pytanie:

Dlaczego jest | tee <FILENAME>tak powszechny we wszystkich dokumentach Ubuntu, czy jest to po prostu dobra praktyka, w przeciwnym razie nie byłoby łatwiej po prostu użyć przykładu 2 zamiast przekazywać dane wyjściowe z echodo tee?

Alexej Magura
źródło
1
Brakuje sudo w swoich poleceniach; które pokażą różne wyniki między 2;)
Rinzwind
1
@ Rinzwind Uruchamiam te polecenia jako root.
Alexej Magura,

Odpowiedzi:

83

Jest różnica: tee duplikuje dane wyjściowe: wysyła je zarówno do pliku, jak i do wyświetlacza.

Ale jest więcej:

  • Na przykład, jeśli chcesz zapisać ciąg znaków w dwóch plikach jednocześnie, możesz użyć polecenia z tee:

     echo "some text" | tee file1 > file2  
    
  • Kolejną rzeczą, która może ci pomóc, jest uniknięcie jednego problemu podczas używania sudo. Normalny operator przekierowania wyjścia jest zawsze wykonywany z uprawnieniami użytkownika, również podczas pisania sudo przed poleceniem, które generuje tekst STDOUT. Innymi słowy, to się nie powiedzie, jeśli nie masz uprawnień do zapisu do tego pliku:

     sudo echo "something" > bar  
    

    Ale z tee wszystko pójdzie dobrze:

    echo "something" | sudo tee bar  
    

2 przykłady z tej strony . Ma trochę więcej.

Rinzwind
źródło
Możesz sudobez tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf
7
@wilf tak, ale kiedy trzeba wysyłać cytaty ", robi się bałagan
Braiam
3
W pierwszym przypadku, jeśli chcesz pisać do plików N, wolałbym echo "some text" | tee file1 file2 ... fileNi może dołączyć > /dev/null, jeśli nie chcesz bałaganu na standardowym wyjściu.
Elmar Zander
Niezły @ElmarZander :)
Rinzwind
13

teepobiera standardowy strumień wejściowy i zapisuje go zarówno w standardowym strumieniu wyjściowym, jak i w strumieniu plików. Jeśli pomaga ludziom pamiętać, nazwa polecenia pochodzi od rozdzielacza T w hydraulice. Jest ładny artykuł na Wikipedii, w którym dowiedziałem się o pochodzeniu nazwy polecenia.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

użytkownik391339
źródło
11

Po pierwsze, teesam nie dołącza tekstu ani nie >.

Jest tee -ai jego uzupełnieniem, >>że DODAWA tekst.

Nie wierzę, że wszystkie powłoki obsługują tę >>funkcję, dlatego teejest częściej używana. (Pomyśl o zwykłym starym sh). Tee to polecenie, a >>operator.

Jeśli używasz (mój osobisty faworyt) bash, >i >>są dużo ładniejsze / łatwiejsze.

Użycie teepozwala także na sudo PO PROSTU to polecenie, więc nie musisz sudo całej instrukcji, jak w sudo sh -c "echo foo > bar". teepozwala również podzielić wynik. Oczywiście wszystko to można zobaczyć w man tee. To głównie twoje osobiste preferencje.

Więcej informacji można znaleźć tutaj i tutaj .

Kaz Wolfe
źródło
5
Wyjaśnienie na temat „sudo po prostu to polecenie”, dla każdego, kto sudo somecommand >> fileauzna to za trochę skomplikowane: użycie formularza podobnego uruchomi się, sudo somecommanda następnie, jako użytkownik wywołujący , dołączy wynik filea. Używanie sudo sh -c "somecommand >> filea"działa, ale może powodować koszmary z cytowaniem zagnieżdżonym. Użycie somecommand | sudo tee -a fileauruchamia się somecommandjako użytkownik wywołujący, a następnie dołącza dane wyjściowe fileajako root - czego zwykle chce użytkownik.
Darael
@Darael Zredagowałem post. Dziękujemy za wyjaśnienie.
Kaz Wolfe