Çıktının çoklu günlük dosyalarına nasıl yönlendirileceği


52

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

6
İle zshkullanabilirsiniz some_command >output_log_1 >output_log_2.
jofel

Yanıtlar:


70

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

stderr birden fazla dosyada yönlendirilebilir mi?
hazneden

Evet, yönlendirme sayesinde yapılabilir: find / -name test 2> & 1 | tee file1 file2 file3
akond

@akond, 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.
katına,

@doubledecker 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 .
Minix

4
Birden fazla dosya eklemek de mümkündür:echo test | tee --append file1 file2
user1364368

13

Çı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.


@doubledecker - koşullarınıza uygun gibi görünüyor, bu yüzden cevap olarak kabul edilebilir. Ayrıca, bunu version 4.3.11(1)-release (i686-pc-linux-gnu)Ubuntu 14.04'te GNU bash ( ) altında test ettikten sonra +1 .
belacqua

9

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

bu başka bir cevabın söylediği şey az ya da çok ( -a tee hariç )
Archemar

Bu gitmek için yol.
71GA

5

@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 .


2

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

2
Bu daha önce verilmiş olan cevaplardan gerçekten ne kadar farklı? Birkaç kişi muhtemelen değişmez istiyorum Özellikle de file1aracılığıyla file8isimleri olarak ve bu dosyaların isimleri için muhtemel sadece örnek tutuculardır
Eric Renouf

1
Muhtemelen ya da değil, bu tam olarak ihtiyacım olan çözüm ve başkasına yardım edebileceğini düşündüm.
user149146,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.