cara mengarahkan output ke beberapa file log

52

Bagaimana cara mengarahkan output standar ke beberapa file log? Berikut ini tidak berfungsi:

some_command 1> output_log_1 output_log_2 2>&1
doubledecker
sumber
6
Dengan zsh, Anda bisa menggunakannya some_command >output_log_1 >output_log_2.
jofel

Jawaban:

70

Lihat man tee:

NAME: tee - baca dari input standar dan tulis ke output dan file standar

SYNOPSIS: tee [OPTION] ... [FILE] ...

Demikian:

echo test | tee file1 file2 file3
akond
sumber
dapatkah stderr juga dialihkan ke lebih dari satu file?
fromnaboo
Ya, itu bisa dilakukan berdasarkan pengalihan: temukan / -nama uji 2> & 1 | tee file1 file2 file3
akond
@ Acond, cmd 2>&1 | tee log1 log2 saya mencoba menjalankan seperti di atas, tetapi saya perlu menekan ctrl-c untuk mengarahkannya ke file log kedua. juga hasilnya dicetak pada konsol. Saya ingin output perintah dialihkan ke log tetapi tidak di konsol. bantuan apa pun dihargai.
doubledecker
@doubledecker teePerintah menulis stdinke file dan juga ke stdout. Jika Anda tidak ingin output muncul di terminal, Anda harus mengarahkan ulang /dev/nullseperti biasanya.
Minix
4
Dimungkinkan juga untuk menambahkan ke beberapa file:echo test | tee --append file1 file2
user1364368
13

Katakanlah output Anda dihasilkan dari suatu fungsi cmd(),:

cmd() {
    echo hello world!
}

Untuk mengalihkan output dari cmdke dua file, tetapi tidak ke konsol, Anda dapat menggunakan:

cmd | tee file1 file2 >/dev/null

Ini akan berfungsi untuk banyak file, mengingat pemipaan sumber data apa pun ke tee:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

Ini juga akan berfungsi:

echo $(cmd) | tee file1 file2 >/dev/null

Tanpa /dev/nullpengalihan, tee akan mengirim output ke stdout di samping file yang ditentukan.

Misalnya, jika ini dijalankan dari konsol, Anda akan melihat hasilnya di sana. Jalankan dari crontab, output akan muncul pesan status yang dikirimkan kepada Anda (juga lihat jawaban Gilles di sini https://unix.stackexchange.com/a/100833/3998 ).

Ini bekerja untuk saya di bash di Ubuntu 12.04, dan telah diverifikasi di Ubuntu 14.04 menggunakan GNU bash 4.3.11 (1), jadi itu harus bekerja pada versi bash GNU baru-baru ini.

KP MacGregor
sumber
@doubledecker - sepertinya ini memenuhi persyaratan Anda, jadi dapat diterima sebagai jawabannya. Juga, +1 karena saya telah menguji ini di bawah GNU bash ( version 4.3.11(1)-release (i686-pc-linux-gnu)) di Ubuntu 14.04.
belacqua
9

Itu posting lama tapi saya baru menemukannya sekarang ...

Alih-alih mengarahkan output ke > /dev/nullAnda dapat mengarahkan kembali ke file terakhir:

echo "foobarbaz" | tee file1 > file2

Atau untuk menambahkan output:

echo "foobarbaz" | tee -a file1 >> file2
James Cook
sumber
ini kurang lebih apa yang dikatakan jawaban lain (kecuali untuk -a tee)
Archemar
Ini cara untuk pergi.
71GA
5

Seperti @jofel disebutkan dalam komentar di bawah jawaban, ini dapat dilakukan secara native di zsh:

echo foobar >file1 >file2 >file3

atau, dengan ekspansi brace:

echo foobar >file{1..3}

Secara internal ini bekerja sangat mirip dengan teejawaban yang diberikan di atas. Shell menghubungkan stdout perintah ke proses yang menyalurkan ke beberapa file; Oleh karena itu, tidak ada keuntungan teknis kuat untuk melakukannya dengan cara ini (tetapi tidak terlihat baik nyata). Lihat yang zshpengguna untuk lebih.

strugee
sumber
2

Namun, tidak dapat berkomentar, cara lain untuk mengekspresikan

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

Bisa disederhanakan untuk ini, ketika berhadapan dengan banyak file.

echo "foobarbaz" | tee file{1..8} > /dev/null
pengguna149146
sumber
2
Bagaimana ini benar-benar berbeda dari jawaban lain yang sudah diberikan? Terutama karena beberapa orang mungkin ingin literal file1melalui file8sebagai nama mereka dan mereka cenderung hanya contoh placeholder untuk nama-nama file
Eric Renouf
1
Kemungkinan atau tidak, ini adalah solusi yang saya butuhkan, dan saya pikir itu bisa membantu orang lain.
user149146
-2

Saya membutuhkan file log sesi dan file lain untuk semua sesi yang saya lakukan:

echo blabla |tee thisession >>allsessions

Gediz GÜRSU
sumber
The teeperintah telah disebutkan.
RalfFriedl