23 Haziran 2020 Salı

tee komutu - stdout'a Giden Çıktıyı Dosyaya Yazar

Giriş
Açıklaması şöyle.
At its simplest, it takes data on standard input and writes that to standard output and one (or more) files.
Normalde stdout'a giden çıktıyı hem ekran hem de dosyaya yazdırmak için kullanılır. Eğer sadece şöyle yaparsak
do_something >> logfile
veya şöyle yaparsak
do_something_else > logfile
çıktı sadece dosyaya gider. Ancak hem ekrana hem de dosyaya göndermek için tee kullanılır.

Kullanım
- tee'den sonra bir dosya ismi verilir.
- Bazen tee'den sonra yeni bir pipie işareti ile tee'de çıktısını başka uygulamaya geçer

1. Komutun Çıktısı
tee komutun çıktısını pipe ile okur
Örnek
Hem stdout hem de dosyaya yazdırmak için şöyle yaparız.
$ ls -l /etc/passwd | tee logfile.txt
Örnek
Şöyle yaparız.
$ echo "hi" | tee test.txt
hi
Örnek
Şöyle yaparız.
rpm -qa | tee file | wc -l
2. Betikin Çıktısı
tee komutun çıktısını pipe ile okur

Örnek
Şöyle yaparız.
./script.sh | tee logfile.txt
Örnek
Şöyle yaparız
a-command | tee logfile.txt | myscript
Seçenekler
-a seçeneği
Açıklaması şöyle. Dosyaya ekleme (append) için kullanılır.
-a, --append  
   append to the given FILEs, do not overwrite  
Örnek
Şöyle yaparız.
do_something | tee -a logfile
Örnek
Şöyle yaparız.
./script1.sh | tee -a logfile.txt
./script2.sh | tee -a logfile.txt
Örnek
Şöyle yaparız.
( cmd | tee -a file2 ) >> file1 2>&1
-i seçeneği
Açıklaması şöyle.
-i, --ignore-interrupts  
   ignore interrupt signals   
Örnek
Elimizde şöyle bir komut olsun. ping'in çıktısını tee ala alalım ve sonra Crtl + C ile durduralım
$ ping google.com | tee log
PING google.com (74.125.131.113) 56(84) bytes of data.
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=1 ttl=56 time=34.1 ms
...
^C
Açıklaması şöyle
Ctrl+ C causes SIGINT to be sent to all processes in the foreground process group, i.e. in this scenario all the processes in the pipeline (ping and tee). tee doesn’t catch SIGINT, so when it receives the signal, it dies, closing its end of the pipe. What happens next is a race: - if ping was still outputting, it will die with SIGPIPE before it gets the SIGINT; 
- if it gets the SIGINT before outputting anything, it will try to output its summary and die with SIGPIPE. 

In any case, there’s no longer anywhere for the output to go.
Şöyle yaparız. Böylece Ctrl + C ile tee ölmez. ping kapanır ve daha sonra da tee kapanır.
$ ping google.com | tee --ignore-interrupts log 
-help seçeneği
Açıklaması şöyle.
--help  
   display this help and exit  
--version
   output version information and exit
--output_error seçeneği
Eğer myscrip hata verirse tee çalışmayı durdurur. Bu seçenek ile myscrip hata verse bile tee çalışmaya devam eder ve çıktı logfile.txt dosyasına yazılmaya devam eder.
Örnek
Şöyle yaparız
a-command | tee --output-error=warn logfile.txt | myscript


Hiç yorum yok:

Yorum Gönder