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.
tee
komut yazıyor stdin
dosya (lar) ve aynı zamanda etmek stdout
. Çıktının terminalde görünmesini istemiyorsanız, /dev/null
normalde 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ışı cmd
iki 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/null
Yö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/null
size 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, tee
yukarı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 zsh
kı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
file1
aracılığıyla file8
isimleri olarak ve bu dosyaların isimleri için muhtemel sadece örnek tutuculardır
zsh
kullanabilirsinizsome_command >output_log_1 >output_log_2
.