tee to mały, ale wredny w dobrym sensie narzędziownik z rodziny GNU coreutils. Czyta dane ze standardowego wejścia i rozdziela je na dwa kierunki naraz: zapisuje do jednego lub wielu plików oraz przepuszcza dalej na standardowe wyjście. Nazwa wzięła się z trójnika hydraulicznego w kształcie litery T — jeden strumień wchodzi, dwa wychodzą. Dzięki temu podglądasz efekt polecenia na ekranie i jednocześnie zachowujesz go w logu, bez uruchamiania czegokolwiek dwa razy.
Składnia i najważniejsze opcje
Podstawowa forma to polecenie | tee [opcje] plik.... Możesz podać kilka plików naraz — tee zapisze do każdego z nich to samo.
-a,--append— dopisuje do pliku zamiast go nadpisywać (bez tego domyślnie czyścisz zawartość).-i,--ignore-interrupts— ignoruje sygnał SIGINT (Ctrl+C), przydatne przy długich potokach.-p— rozszerzenie GNU: nie przerywa działania przy błędach zapisu do potoku (diagnostyka zależna od trybu poniżej).--output-error[=TRYB]— rozszerzenie GNU sterujące reakcją na błędy: np.warn,warn-nopipe,exit,exit-nopipe.--help— wyświetla pomoc.--version— pokazuje wersję.
Uwaga: -a i -i to standard POSIX i zadziałają wszędzie. -p oraz --output-error to dodatki GNU.
Przykłady użycia
ls -l | tee lista.txt— pokazuje listing na ekranie i zapisuje go dolista.txt.echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts— dopisuje wpis do pliku należącego do roota; to klasyczny trik, bo samosudo echo > pliknie działa (przekierowanie robi Twoja powłoka, nie sudo).make 2>&1 | tee build.log— łapie do loga zarówno wyjście, jak i błędy kompilacji, a Ty widzisz je na bieżąco.cat dane.txt | tee kopia1.txt kopia2.txt > /dev/null— zapisuje wejście do dwóch plików naraz, a ekran zostaje czysty.ping -c 4 8.8.8.8 | tee wynik.txt | grep "time="— zapisuje pełny wynik do pliku i jednocześnie filtruje go dalej w potoku.
Częste błędy i pułapki
Najczęstsza wpadka: zapominasz o -a i tee nadpisuje plik przy każdym uruchomieniu, kasując wcześniejszy log. Druga pułapka to uprawnienia — tee uruchamiany przez sudo ratuje sytuację przy plikach roota, ale wtedy pamiętaj, że przekierowanie > nadal wykonuje Twoja powłoka bez podniesionych praw. Trzecia rzecz: sam tee nie łapie standardowego wyjścia błędów — jeśli chcesz logować błędy, musisz je najpierw skierować do stdout przez 2>&1. I ostatnie: jeśli potok dalej czyta tylko część danych (np. head), tee może dostać błąd zapisu do potoku — tu pomaga -p lub --output-error.
Powiązane komendy: cat, dd, script, logger, sponge (z pakietu moreutils).