Bagaimana cara mengarahkan output standar ke beberapa file log? Berikut ini tidak berfungsi:
some_command 1> output_log_1 output_log_2 2>&1
Bagaimana cara mengarahkan output standar ke beberapa file log? Berikut ini tidak berfungsi:
some_command 1> output_log_1 output_log_2 2>&1
Jawaban:
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
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.
tee
Perintah menulis stdin
ke file dan juga ke stdout
. Jika Anda tidak ingin output muncul di terminal, Anda harus mengarahkan ulang /dev/null
seperti biasanya.
echo test | tee --append file1 file2
Katakanlah output Anda dihasilkan dari suatu fungsi cmd()
,:
cmd() {
echo hello world!
}
Untuk mengalihkan output dari cmd
ke 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/null
pengalihan, 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.
version 4.3.11(1)-release (i686-pc-linux-gnu)
) di Ubuntu 14.04.
Itu posting lama tapi saya baru menemukannya sekarang ...
Alih-alih mengarahkan output ke > /dev/null
Anda dapat mengarahkan kembali ke file terakhir:
echo "foobarbaz" | tee file1 > file2
Atau untuk menambahkan output:
echo "foobarbaz" | tee -a file1 >> file2
-a
tee)
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 tee
jawaban 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 zsh
pengguna untuk lebih.
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
file1
melalui file8
sebagai nama mereka dan mereka cenderung hanya contoh placeholder untuk nama-nama file
Saya membutuhkan file log sesi dan file lain untuk semua sesi yang saya lakukan:
echo blabla |tee thisession >>allsessions
tee
perintah telah disebutkan.
zsh
, Anda bisa menggunakannyasome_command >output_log_1 >output_log_2
.