Tee – czyli równoległe pisanie do konsoli i pliku

Tee - czyli równoległe pisanie do konsoli i pliku

Poziom trudności
1.5/5

Uruchamiając jakikolwiek program pod Linux’em z konsoli, widzimy informacje, jakie ta aplikacja wysyła do konsoli. Czasami są one dla nas totalnie niezrozumiałe, czasami potrafimy coś z nich wyczytać, a czasami nawet podejmujemy w konsoli jakąś interakcję z aplikacją. Jedno jest pewne, zawsze ich celem jest pomoc w zrozumieniu działania aplikacji oraz ewentualna analiza, co się w danej chwili dzieje, lub już się stało.

Aby uruchomić jakiś program lub skrypt przeważnie wystarczy wpisać jego nazwę (np. ls), czasami trzeba ją poprzedzić instrukcją wykonywania (np. ./skrypt.sh), a czasami nazwą programu wykonującego (np. python3 sample.py). Nieważne, w jaki sposób uruchomimy samą aplikację, dane wyjściowe z niej będą z reguły kierowane do konsoli.

Składnia

Z pomocą przychodzi nam tutaj właśnie polecenie tee. Dzięki niemu będziemy mogli jednocześnie przeglądać dane w konsoli oraz zapisywać je do pliku, a nawet plików. Program tee uruchamiamy na wyjściu docelowo uruchamianego programu wykorzystując do tego tzw. pipe, czyli ‚|’. Pierwszy przykład będzie bazował na prostym skrypcie Python’owym, który wypisuje słowo TEST tyle razy, ile mu podamy:

qabrio@test:~/tmp$ python3 sample.py | tee result_TEST
Example 1
Count: 5
TEST TEST TEST TEST TEST
qabrio@test:~/tmp$ cat result_TEST
Example 1
Count:
TEST TEST TEST TEST TEST
qabrio@test:~/tmp$

Wysyłanie wyników do kilku różnych plików wykonuje się tak samo prosto:

qabrio@test:~/tmp$ python3 sample.py | tee result_TEST1 result_TEST2
Example 1
Count: 3
TEST TEST TEST
qabrio@test:~/tmp$ cat result_TEST1
Example 1
Count:
TEST TEST TEST
qabrio@test:~/tmp$ cat result_TEST2
Example 1
Count:
TEST TEST TEST
qabrio@test:~/tmp$

Jeśli pliki, do których przekierowujemy strumień danych, nie będą istnieć, to zostaną automatycznie utworzone w folderze, gdzie się w danej chwili znajdujemy. Trzeba jednak uważać na fakt, że jeśli plik taki będzie istniał, program go automatycznie nadpisze bez żadnego pytania, czy powiadomienia.

Podstawowe flagi:

-a –append – plik docelowy nie będzie nadpisywany, a dane zostaną dodane na jego końcu
-i –ignore-interrupts – ignorowanie sygnałów przerwania – np. CTRL+C

O ile użycie flagi -a nie powinno stwarzać problemów, o tyle w przypadku użycia flagi -i wymaga kilku słów komentarza. Jeśli uruchamiamy polecenie tee na jakiejś aplikacji z wykorzystaniem pipe, flaga -i praktycznie nic nie zmieni, gdyż używając CTRL+C przerwiemy działanie programu bazowego. Jednak różnica zauważymy przy samodzielnym wykorzystaniu tee:

qabrio@test:~/tmp$ tee result_file
test1
test1
test2
test2
^C
qabrio@test:~/tmp$

Natomiast z flagą -i:

qabrio@test:~/tmp$ tee -i result_file
test1
test1
test2
test2
^C^C
^C

Przezroczystość

Co ciekawe polecenie tee jest niejako dla nas przezroczyste. Operacja wykonana na uruchamianym programie bazowym, może również być wykonana na tee:

qabrio@test:~/tmp$ ls -l | grep result
-rw-rw-r-- 1 qabrio qabrio 44 sty 24 19:56 result_TEST
-rw-rw-r-- 1 qabrio qabrio 34 sty 24 19:57 result_TEST1
-rw-rw-r-- 1 qabrio qabrio 34 sty 24 19:57 result_TEST2
qabrio@test:~/tmp$ ls -l | tee file_list | grep result
-rw-rw-r-- 1 qabrio qabrio 44 sty 24 19:56 result_TEST
-rw-rw-r-- 1 qabrio qabrio 34 sty 24 19:57 result_TEST1
-rw-rw-r-- 1 qabrio qabrio 34 sty 24 19:57 result_TEST2
qabrio@test:~/tmp$ cat file_list

Należy jednak pamiętać, że w powyższym przykładzie zawartością pliku file_list będzie pełna zawartość obecnego katalogu, natomiast wyświetlone będą tylko elementy zawierające w sobie słowo result.

Dodaj komentarz