Saya tidak bisa membuat Dennis satu kalimat yang sederhana, jadi inilah metode yang jauh lebih berbelit-belit. Saya akan mencoba yang pertama.
Seperti disebutkan, Anda dapat menggunakan exec untuk mengarahkan kesalahan standar & keluar standar untuk seluruh skrip. Seperti itu:
exec > $LOGFILE 2>&1
Ini akan menampilkan semua stderr dan stdout ke $ LOGFILE.
Sekarang, karena Anda ingin ini ditampilkan ke konsol dan juga file log, Anda juga harus menggunakan pipa bernama untuk exec untuk menulis, dan tee untuk membaca.
(Dennis satu-liner secara teknis melakukan ini juga, meskipun jelas dengan cara yang berbeda) Pipa itu sendiri dibuat dengan mkfifo $PIPEFILE
. Kemudian lakukan hal berikut.
# Mulai menulis tee ke file log, tetapi menarik inputnya dari pipa bernama kami.
tee $ LOGFILE <$ PIPEFILE &
# tangkap ID proses tee untuk perintah tunggu.
TEEPID = $!
# redirect sisa stderr dan stdout ke pipa bernama kami.
exec> $ PIPEFILE 2> & 1
gema "Buat perintah Anda di sini"
gema "Semua standar mereka akan diupayakan."
gema "Begitu juga kesalahan standar mereka"> & 2
# tutup deskriptor file stderr dan stdout.
exec 1> & - 2> & -
# Tunggu tee selesai karena sekarang ujung pipa lainnya telah ditutup.
tunggu $ TEEPID
Jika Anda ingin teliti, Anda dapat membuat dan menghancurkan file pipa bernama di awal dan akhir skrip Anda.
Sebagai catatan, saya mendapatkan sebagian besar dari posting blog yang sangat informatif dari seorang pria: ( Versi yang diarsipkan )