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

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

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.


@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

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.


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

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


The teeperintah telah disebutkan.
RalfFriedl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.