Standart çıktı birden çok günlük dosyasına nasıl yönlendirilir? Aşağıdaki çalışmıyor:
some_command 1> output_log_1 output_log_2 2>&1
Standart çıktı birden çok günlük dosyasına nasıl yönlendirilir? Aşağıdaki çalışmıyor:
some_command 1> output_log_1 output_log_2 2>&1
Yanıtlar:
Bakınız man tee:
ADI: tee - standart girdiden oku ve standart çıktıya ve dosyalara yaz
SYNOPSIS: tee [SEÇENEK] ... [DOSYA] ...
Buna göre:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2 yukarıdaki gibi çalıştırmayı denedim, ancak ikinci günlük dosyasına yönlendirmek için ctrl-c tuşlarına basmam gerekiyor. ayrıca çıktı konsolda basılmıştır. Komut çıktısının kayıtlara yönlendirilmesini istiyorum ancak konsolda değil. Herhangi bir yardım takdir edilmektedir.
teekomut yazıyor stdindosya (lar) ve aynı zamanda etmek stdout. Çıktının terminalde görünmesini istemiyorsanız, /dev/nullnormalde yaptığınız gibi yönlendirmeniz gerekir .
echo test | tee --append file1 file2
Çıktınızın bir işlevden üretildiğini varsayalım cmd():
cmd() {
echo hello world!
}
Çıkışı cmdiki dosyaya yönlendirmek , ancak konsola yönlendirmek için şunları kullanabilirsiniz:
cmd | tee file1 file2 >/dev/null
Bu, tee için herhangi bir veri kaynağı borusu verilen birden fazla dosya için çalışacaktır:
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
Bu da işe yarayacak:
echo $(cmd) | tee file1 file2 >/dev/null
/dev/nullYönlendirme olmadan , tee belirtilen dosyalara ek olarak stdout'a çıktı gönderir .
Örneğin, bu konsoldan çalıştırılıyorsa, çıktıyı göreceksiniz. Bir crontab'dan çalıştırın, çıktı size postayla gönderilen durum mesajını gösterecektir (ayrıca Gilles’ün verdiği yanıtı https://unix.stackexchange.com/a/100833/3998 ) göreceksiniz .
Bu benim için Ubuntu 12.04'te bash'te çalıştı ve GNunt bash 4.3.11 (1) kullanılarak Ubuntu 14.04'te doğrulandı, bu nedenle herhangi bir GNU bash sürümünde çalışması gerekiyor.
version 4.3.11(1)-release (i686-pc-linux-gnu)Ubuntu 14.04'te GNU bash ( ) altında test ettikten sonra +1 .
Eski bir yazı ama şimdi buldum ...
Çıktıyı > /dev/nullsize yeniden yönlendirmek yerine son dosyaya yönlendirebilirsiniz:
echo "foobarbaz" | tee file1 > file2
Veya çıktıyı eklemek için:
echo "foobarbaz" | tee -a file1 >> file2
-a tee hariç )
@Jofel cevabın altındaki bir yorumda belirtildiği gibi, bu yerel olarak yapılabilir zsh:
echo foobar >file1 >file2 >file3
veya, ayraç genişletme ile:
echo foobar >file{1..3}
Dahili olarak bu, teeyukarıda verilen cevaplara çok benzer şekilde çalışır . Kabuk, komutun stdout'unu birden fazla dosyaya yönlendiren bir işleme bağlar; bu nedenle, bu şekilde yapmanın zorlayıcı bir teknik avantajı yoktur (ama gerçekten iyi görünüyor). Daha fazla bilgi için zshkılavuza bakın .
Ancak yorum yapamam, ifade etmenin başka bir yolu
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
Birçok dosya ile çalışırken, basitleştirilebilir.
echo "foobarbaz" | tee file{1..8} > /dev/null
file1aracılığıyla file8isimleri olarak ve bu dosyaların isimleri için muhtemel sadece örnek tutuculardır
zshkullanabilirsinizsome_command >output_log_1 >output_log_2.