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

Jeśli potrzebujesz widzieć wyniki w konsoli oraz jednocześnie zapisywać je do pliku – ten artykuł jest dla Ciebie! Małe, a zarazem wielkie narzędzie tee!

Linux narzędzia - Tee

Linux narzędzia - Tee


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. Dodatkowo ich ewentualna analiza, powzwoli ban sprawdzić 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:

Kodqabrio@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$ 

Co jeśli pliki, do których przekierowujemy strumień danych, nie będą istnieć? 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 –appendplik docelowy nie będzie nadpisywany, a dane zostaną dodane na jego końcu
-i –ignore-interruptsignorowanie 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. Operację, którą wykonujemy na uruchamianym programie bazowym, możemy również wykonać 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.

close

Newsletter