tee

Czyta ze standardowego wejścia i zapisuje jednocześnie do pliku i na wyjście.

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 do lista.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 samo sudo echo > plik nie 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).