Wszystkie zastosowania, tee
jakie kiedykolwiek widziałem, były takie:
do_something | tee -a logfile
Lub:
do_something_else | tee logfile
Czy został tee
wymyślony dla tych, którzy nie wiedzą, że możesz zrobić to samo z przekierowaniami potoku powłoki? Jak na przykład:
do_something >> logfile
Lub:
do_something_else > logfile
Jest praktycznie taki sam i wymaga mniejszej liczby naciśnięć klawiszy na klawiaturze. W jakich ukrytych funkcjach nie widzę tee
?
tee
i I / O przekierowania ? Fakt, że mówi „ przekierowania potoku powłoki, takie jak i ”, nie jest na korzyść tego argumentu i jest argumentem za jego zamknięciem jako niejasnym. Ale w rzeczywistości zadaje wiele pytań: „Jaki jest cel ?”, „ Został wymyślony dla tych, którzy nie wiedzą, że możesz zrobić to samo z przekierowaniami potoku powłoki” i „Jakie ukryte funkcje nie widzę ?”. Co najmniej dwa z tych pytań są zbyt ogólne.>
>>
tee
tee
tee
Odpowiedzi:
Co ty nie widzisz, że
do_something | tee -a logfile
stawia na wyjścielogfile
i standardowe wyjście, gdydo_something >> logfile
stawia je tylko w pliku dziennika.Celem
tee
jest stworzenie scenariusza z jednym wejściem i wieloma wyjściami - tak jak w skrzyżowaniu „T”.EDYTOWAĆ
Pojawiły się komentarze na temat tego, w jaki sposób
tee
umożliwia bardziej bezsensowne użyciesudo
. Jest to obok punktu:cat
,dd
lub może lepiejbuffer
zapewnić taką możliwość z lepszych wyników, jeśli nie potrzebują wiele wyjść. Używajtee
do tego, co zostało zaprojektowane, a nie do tego, co „potrafi”źródło
tee
może nawet przyjmować wiele argumentów i zapisywać do wielu plików jednocześnie.cat
w prosty sposób zamiasttee
np.echo /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern
?echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern
nie działa, ponieważ przekierowanie jest przetwarzane przez powłokę inną niż sudo. Jeśli chodzi odd
,echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_pattern
działa, aledd
często jest przytłoczonym narzędziem, które może wyrządzić ogromne szkody, szczególnie podsudo
. Co do tegobuffer
, nie jest domyślnie instalowany w żadnej dystrybucji opartej na RedHat lub Ubuntu, którą muszę podać (lub MacOS) ...cat
ani nie/bin/cat
działają dla mnie w tej sytuacji. Nie ma znaczenia, skądcat
pochodzi ->
nadal będzie obsługiwany przez powłokę najwyższego poziomu (inną niż sudo). Zaletątee
przejęciacat
w tej sytuacji jest to, że pozwala ono plik wyjściowy zostać przekazany jako param wiersza polecenia (a nie przekierowanie).dd
jest z pewnością realną opcją, choć nadal wolętee
tocat
itee
jak wbudowane? A w jakiej wersjisudo
można uruchamiać wbudowane powłoki?Tee
nie jest bezużyteczneMoże i tak to wiedziałeś? Jeśli nie, czytaj dalej! Lub jeśli wiesz, jak to działa, ale nie wiesz, dlaczego istnieje, przejdź do końca, aby zobaczyć, jak pasuje do filozofii uniksowej.
Jaki jest cel
tee
?W najprostszym przypadku pobiera dane ze standardowego wejścia i zapisuje je na standardowym wyjściu i jednym (lub więcej) plikach. Przyrównano go do trójnika hydraulicznego w sposób, w jaki dzieli jeden wkład na dwa wyjścia (i dwa kierunki).
Przykłady
Weźmy twój pierwszy przykład:
To pobiera dane wyjściowe
do_something
i dołącza je do pliku dziennika, jednocześnie wyświetlając go użytkownikowi. W rzeczywistości strona Wikipediitee
ma to jako drugi przykład:Następny przykład ma jeszcze inne zastosowanie: eskalacja uprawnień :
A może chcesz pobrać dane wyjściowe jednego polecenia, napisać je gdzieś, a także użyć jako danych wejściowych do innego polecenia?
(uznanie za przykłady użycia poleceń Tee )
Tee
współpracuje z filozofią Unix:(Podziękowania dla Basics of the Unix Philosophy )
tee
pasuje do wszystkich:źródło
sudo tee -a
jest prawdopodobnie nowszą innowacją (po raz pierwszy zobaczyłem to w przewodnikach / wiki Ubuntu, szczególnie do ustawiania rzeczy/proc/sys
, ponieważ przejście na Ubuntu miało miejsce, kiedy przełączyłem się nasudo
system oparty (domyślnie konfigurowany jest Ubuntu) zamiast używaćsu
z hasło roota). Myślę, żetee
wcześniejsudo
, więc nie jest to powód dotee
istnienia. Nie potrzebujesztee
tego, wystarczy pisać interaktywnie niżsudo sh -c 'cat > output'
.tee
karmić dwa rurociągifoo | tee >(pipe2) | pipe1
. Inną zabawą jestffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.log
interaktywne wyświetlanie aktualizacji linii statusu na terminalu tty, przy jednoczesnym usuwaniu „linii” kończących się znakiem powrotu karetki zamiast znaku nowej linii w celu faktycznego rejestrowania. (tj. odfiltruj aktualizacje linii statusu). Zasadniczo można umieścićtee /dev/tty
dowolne miejsce w potoku jako wydruk debugowania.>
i konfiguruje przekierowanie, zanim sudo w ogóle się dostanieexec
, więc zdecydowanie nie jest ograniczeniem sudo, że nie obsługuje rzeczy, których nigdy nie widzi. :) Zwykle staram się nazywać to „tokiem pracy w sudo” lub innym podobnym terminem, kiedy go wyjaśniam, zamiast opisywać samego sudo.sudo tee -a
jest IMHO nadużywaniem tee. Stosowaniesudo cat
,sudo dd
lub (z najlepszą wydajność w wielu przypadkach)sudo buffer
, jeśli nie potrzebują wiele wyjść.To wcale nie jest to samo ...
Poniższe wydają się być nieco równoważne, ale nie są to:
Zasadnicza różnica polega na tym, że ten pierwszy zapisał dane tylko do nazwanego pliku, a drugi zapisał
hi
do terminalu (stdout
) i nazwanego pliku, jak pokazano poniżej:tee
pozwala zapisywać dane do pliku i używać ich w dalszym ciągu potoku, pozwalając na robienie użytecznych rzeczy - takich jak przechowywanie danych przed przejściem przez potok:Lub możesz napisać do pliku z podwyższonymi uprawnieniami, nie nadając całego potoku podwyższonych uprawnień (tutaj
echo
jest uruchamiany jako użytkownik, podczas gdytee
zapisuje do pliku jakoroot
):Za pomocą
tee
możesz pisać do wielu plików ( istdout
):Możliwe jest również użycie
exec
z,tee
aby nagrać wszystkie dane wyjściowe skryptu do pliku, jednocześnie pozwalając obserwatorowi (stdout
) zobaczyć dane:źródło
exec > >(tee "$LOGFILE") 2>&1
w skrypcie bash, który pozwala skryptowi wyprowadzać stdout i stderr zarówno do stdout, jak i do wskazanego pliku$LOGFILE
.2>&1
aby upuszczać dane wyjściowe i błędnie, aby txt plików w systemie Windows.To jest koszulka:
Łącznik rurowy w kształcie litery T. Ma wlot i dwa osobne gniazda.
Innymi słowy, dzieli jedną rurę na dwie; jak widelec na drodze.
Podobnie
tee
jest potok (|
), który pozwala przekierować standardowe wejście na dwa osobne wyjścia.Przykład
Powiedz na przykład, że piszesz
ls /
.Otrzymasz wyjście, które wygląda mniej więcej tak:
Przekieruj wyjście do pliku tekstowego
ls / > ls.txt
, a żadne wyjście nie jest wyświetlane w powłoce, tylko w wynikowym pliku tekstowym.Chcesz zobaczyć wynik i jednocześnie przekazać go do pliku tekstowego?
Dodaj a
tee
do swojej potoku (|
) tj .:ls / | tee ls.txt
Porównaj dwa:
źródło
Nie. Wspominasz jeden z niewielu przykładów, w których można przekierować do pliku za pomocą operatorów
>
i>>
.Ale Tee może zrobić znacznie więcej. Ponieważ potokujesz do niego, możesz następnie potokować do czegoś innego.
Dobry przykład znajduje się na stronie Wikipedii :
Zasadniczo możesz potokować do Tee, więc możesz następnie potokować z Tee do czegoś innego. Jeśli wszystko, co chcesz zrobić, to napisać plik dziennika, tak, to tak naprawdę nie potrzebujesz Tee.
źródło
tee
jest daleki od bezużytecznego. Używam go cały czas i cieszę się, że istnieje. Jest to bardzo przydatne narzędzie, jeśli masz potok, który chcesz podzielić. Bardzo prostym przykładem jest to, że masz katalog$d
, który chcesz tarować, a także chcesz go zaszyfrować, ponieważ jesteś paranoikiem (tak jak ja) i nie ufasz nośnikowi pamięci, aby niezawodnie przechowywać dane. Ty mógł zapisać go na dysku, a następnie mieszania go, ale to, że nie, jeśli archiwum zostanie uszkodzona przed jego mieszany. Co więcej, musisz go przeczytać, a jeśli pracujesz na plikach o wielkości kilkuset GB, będziesz wiedział, że naprawdę nie chcesz ich ponownie czytać, jeśli nie musi.Więc po prostu to robię:
Tworzy smołę i przesyła ją do trójnika, a następnie przesyła ją do dwóch podpowłok, w jednej z nich jest mieszana, a w drugiej zapisywana na dysk.
Jest to również świetne, jeśli chcesz wykonać kilka operacji na dużym pliku:
Raz czyta plik, haszy go (dzięki czemu można sprawdzić, czy nadal jest taki, jak powinien), rozpakowuje go i kopiuje w inne miejsce. Nie trzeba w tym celu trzy razy go czytać.
źródło
tee
nie tworzy podpowłoki; wywoływana powłoka działasha5sum
icat
łączy swoje dane wyjściowe z deskryptorami plików, które są przekazywanetee
. Również bezużyteczne użyciecat
; możesz użyć przekierowania wejściowego, abytee
odczytać bezpośrednio zfile.tar.gz
.cat
jest miłość.cat
jest życie.< file.tar.gz tee >(sha256sum) ...
jeśli martwisz się porządkiem leksykalnym przekierowań. Nie zmienia to faktu, że nie ma potrzeby wykonywania całkowicie osobnego procesu tylko do zasilania jednego plikutee
.cat
jest stosunkowo niski. Koszt dodatkowych 100 GiB wywołań systemowych zapisu i odczytu zdecydowanie marnuje dodatkowy czas procesora i przepustowość pamięci dla proponowanego przykładu ogromnego pliku. Pamiętaj, że przepustowość pamięci jest zasobem wspólnym dla wszystkich rdzeni, nie wspominając o dodatkowym zanieczyszczeniu pamięci podręcznej L3 z tego kopiowania. Na x86 z włączonym ograniczeniem Spectre + Meltdown wywołania systemowe są droższe niż kiedyś. Zużywasz mierzalną ilość dodatkowego czasu procesora w trakcie tej kopii. Nie>(cat > foo)
jest też łatwiejsze do zrozumienia niżfoo
IMO.Nitpick w odpowiedzi na @ bertieb mówi: Ten przykład pokazuje, że tee jest używany do ominięcia nieodłącznego ograniczenia w poleceniu sudo. sudo nie może potokować standardowego wyjścia do pliku.
Nie ma żadnego nieodłącznego ograniczenia, tylko nieporozumienie dotyczące sposobu przetwarzania polecenia.
Przykład:
sudo echo 0 > /proc/sys/net/ipv4/ip_forward
Prąd powłoki analizuje wiersz polecenia. Znajduje przekierowanie wyjściowe i wykonuje to. Następnie wykonuje polecenie, które jest
sudo
i udostępnia pozostały wiersz polecenia jako argumenty dla wykonanego polecenia. Jeśli bieżąca powłoka nie ma uprawnień roota, przekierowanie danych wyjściowych zakończy się niepowodzeniem.echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
Działa to, ponieważ przekierowanie wyjścia jest odroczone do
tee
polecenia, które w tym momencie ma uprawnienia roota, ponieważ zostało wykonane za pośrednictwemsudo
.sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
Działa to, ponieważ powłoka wykonująca przekierowanie ma uprawnienia root.
źródło
sudo
polecenie, ale nie do pliku wyjściowego, a przekierowanie działa dobrze:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Jak wspomnieli inni, przesyłanie danych wyjściowych do
tee
polecenia zapisuje je zarówno w pliku, jak i na standardowym wyjściu.Często używam,
tee
gdy chcę przechwycić dane wyjściowe polecenia, którego uruchomienie zajmuje dużo czasu, a także chcę wizualnie sprawdzić dane wyjściowe, ponieważ polecenie to udostępnia. W ten sposób nie muszę czekać na zakończenie działania polecenia przed sprawdzeniem danych wyjściowych.Wydaje się, że jeszcze nie zostało wspomniane (chyba że go przegapiłem), że
tee
polecenie może również zapisywać do wielu plików jednocześnie. Na przykład:wypisze wszystkie
*.png
pliki w bieżącym katalogu do dwóch różnych plików (a.txt
ib.txt
) jednocześnie.W rzeczywistości możesz wpisać tekst do kilku różnych plików jednocześnie
tee
:źródło
Najpopularniejszym zastosowaniem tee jest wyświetlanie tekstu na terminalu w tym samym czasie, gdy wysyłasz go do pliku (lub plików). Sformułowanie twojego pytania zakłada, że piszesz tylko tekst w plikach dziennika. Mam skrypty, które zapisują listy nazw plików lub nazw katalogów w celu wyzwolenia plików (do przetworzenia przez inne skrypty asynchronicznie) i używam tee do wysyłania tej samej treści na standardowe wyjście. Wszystkie standardowe wyjścia są kierowane do dzienników. Mam więc tekst tam, gdzie chcę, i mam zapis z dziennika, że to zrobiłem, wszystko z jednej instrukcji „echo”
tee jest także najlepszą metodą w Uniksie do tworzenia wielu identycznych plików. Używam go od czasu do czasu do tworzenia wielu pustych plików, takich jak ten ...
źródło
touch
? (bardziej oczywiste, co się dzieje)touch
nie będzie obcinać plików, jeśli już istnieją, ale tylko aktualizuje swoje znaczniki czasu i pozostawia ich zawartość taką, jaka jest; aletee
je obetnie. Poza tym robienierm
+touch
różni się odtee
(pomyśl o twardych linkach i dowiązaniach symbolicznych)truncate -s 0
? :-)Wyobraź sobie, że chcesz zapisać dane wyjściowe polecenia w pliku dziennika ORAZ wydrukować na standardowe wyjście. Kiedy musisz to zrobić w tym samym czasie, musisz
tee
.Przykładem zastosowania są skrypty kompilacji, które zapisują całą kompilację na standardowe wyjście (np. Dla Jenkinsa), ale ważne rzeczy w tym samym czasie w osobnym pliku dziennika (dla e-maili podsumowujących).
Naprawdę zaczniesz zaginąć,
tee
gdy będziesz musiał pisać skrypty w systemie Windows. Nie matee
i to jest naprawdę denerwujące.źródło
tee
. Cmd nigdy nie był przeznaczony do poważnego pisania skryptów - po to był VBS. Powershell to nowe narzędzie do tworzenia skryptów. To prawda, że Cmd jest wciąż dość potężny, ale narzędzi wiersza poleceń jest niewiele.