Di shell Unix, saya memiliki file env (file env mendefinisikan parameter yang diperlukan untuk menjalankan skrip pengguna seperti nama dan jalur file log, mengarahkan output dan kesalahan ke file log, detail koneksi database, dll ) yang mengarahkan semua output ( pesan gema ) dan kesalahan pada file log dari skrip yang dieksekusi menggunakan kode berikut:
exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}
File env dijalankan di awal setiap skrip. Karena kode di atas dalam file env, semua output konsol yang mungkin merupakan output pengguna atau kesalahan secara langsung dikeluarkan ke file log yang sebenarnya saya butuhkan.
Tetapi ada beberapa keluaran pengguna selektif yang ingin saya tampilkan di konsol dan file log. Tetapi karena kode di atas saya tidak dapat melakukannya.
Saya tahu bahwa jika saya menghapus kode di atas, saya bisa mendapatkan hasil yang diinginkan untuk kasus ini, tetapi saya harus menulis semua output lainnya secara manual ke file log yang bukan merupakan tugas yang mudah.
Apakah ada cara untuk mendapatkan output di konsol dan file log tanpa menghapus kode di atas?
/dev/fd/3
adalah nama file yang merujuk ke "fd 3 yang saat ini terbuka", jaditee /dev/fd/3
akan menulis apa pun yang masuk di stdin ke fd 1 dan juga fd 3 (/dev/fd/3
file). Fd 1 terhubung ke file log, fd 3 terhubung ke konsol.echo "blah" | tee file1.txt | tee file2.txt >/dev/null
'Bla' tidak akan diletakkan di file1.txt & file2.txt, tetapi tidak ditulis ke konsol.tee
, yang pada gilirannya menulis ke terminal) daripada langsung ke terminal, dan menyesuaikan outputnya agar sesuai.Ya, Anda ingin menggunakan
tee
:Cukup pipa perintah Anda ke tee dan teruskan file sebagai argumen, seperti:
Ini mencetak output ke STDOUT dan menulis output yang sama ke file log. Lihat
man tee
untuk informasi lebih lanjut.Perhatikan bahwa ini tidak akan menulis stderr ke file log, jadi jika Anda ingin menggabungkan dua aliran, gunakan:
sumber
script.sh: line 5: exec: 1: not found
Saya mencoba jawaban joonty, tetapi saya juga mendapatkan
kesalahan. Inilah yang paling cocok untuk saya ( dipastikan juga berfungsi di zsh):
File /tmp/both.log sesudahnya berisi
/Tmp/both.log ditambahkan kecuali Anda menghapus -a dari tee.
Petunjuk:
>(...)
adalah substitusi proses. Ini memungkinkanexec
ketee
perintah seolah-olah itu adalah file.sumber
exec > >(tee ${LOG_FILE}) 2>&1
.Saya ingin menampilkan log di stdout dan file log bersama dengan stempel waktu. Tak satu pun dari jawaban di atas berhasil untuk saya. Saya menggunakan substitusi proses dan perintah exec dan menghasilkan kode berikut. Contoh log:
Tambahkan baris berikut di bagian atas skrip Anda:
Semoga ini bisa membantu seseorang!
sumber
untuk file log Anda mungkin tanggal untuk memasukkan ke dalam data teks. kode berikut dapat membantu
ouput: 2. File log akan dibuat pada proses pertama dan terus diperbarui dari proses berikutnya. Jika file log hilang di masa mendatang, skrip akan membuat file log baru.
sumber
Saya telah menemukan cara untuk mendapatkan hasil yang diinginkan. Padahal cara itu mungkin agak tidak ortodoks. Anyways ini dia. Di file redir.env saya memiliki kode berikut:
Kemudian di skrip sebenarnya saya memiliki kode berikut:
Berikut menggemakan output hanya untuk konsol, log output hanya file log dan pesan output untuk kedua file log dan konsol.
Setelah menjalankan file skrip di atas, saya memiliki output berikut:
Di konsol
Untuk file Log
Semoga bantuan ini.
sumber
Coba ini, ini akan berhasil:
sumber
exec > >(tee -a ${log_file} )
bekerja sempurna untuk kebutuhan saya. Solusi sebelumnya di atas akan mengganggu bagian skrip saya yang memaksa keluar jika gagal. Terima kasihsumber
Saya merasa sangat berguna untuk menambahkan stdout dan stderr ke file log. Saya senang melihat solusi dengan alfonx dengan
exec > >(tee -a)
, karena saya bertanya-tanya bagaimana cara melakukannya dengan menggunakanexec
. Saya menemukan solusi kreatif menggunakan sintaks here-doc dan.
: /unix/80707/how-to-output-text-to-both-screen-and-file-inside-a-shell -naskahSaya menemukan bahwa di zsh, solusi here-doc dapat dimodifikasi menggunakan konstruksi "multios" untuk menyalin keluaran ke stdout / stderr dan file log:
Ini tidak dapat dibaca sebagai
exec
solusinya tetapi memiliki keuntungan memungkinkan Anda untuk mencatat hanya sebagian dari skrip. Tentu saja, jika Anda menghilangkan EOF maka seluruh skrip akan dieksekusi dengan logging. Saya tidak yakin bagaimanazsh
mengimplementasikan multios, tetapi mungkin memiliki lebih sedikit overhead daripadatee
. Sayangnya tampaknya multios tidak dapat digunakan denganexec
.sumber