Saya memiliki skrip bash dengan banyak output dan saya ingin mengubah skrip itu (bukan membuat yang baru) untuk menyalin semua output ke file, sama seperti itu akan terjadi jika saya menyalurkannya melalui tee.
Saya punya file script.sh :
#!/bin/bash
init
do_something_that_outputs_stuff_to_STDOUT
launch_applications_that_output_to_STDOUT
fini
dan saya ingin membuat salinan STDOUT ke file script.log tanpa harus mengetik ./script.sh | tee script.log
setiap waktu.
Terima kasih, Tom
Jawaban:
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.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 )
sumber
Cukup tambahkan ini ke awal skrip Anda:
Itu akan menambahkan semua output yang dikirim ke stdout ke file
script.log
, meninggalkan konten sebelumnya di tempat. Jika Anda ingin memulai baru setiap kali skrip dijalankan, tambahkan sajarm script.log
tepat sebelumexec
perintah itu atau hapus-a
daritee
perintah.The
-i
pilihan menyebabkantee
untuk mengabaikan sinyal interrupt dan memungkinkantee
untuk menangkap satu set output yang lebih lengkap.Tambahkan baris ini untuk juga menangkap semua kesalahan (dalam file terpisah):
Ruang-ruang di antara banyak
>
simbol itu penting.sumber
Ini adalah versi gabungan dari jawaban yang diposting oleh Dennis Williamson sebelumnya. Tambahkan kedua & keluar ke script.log dalam urutan yang benar.
Tambahkan baris ini ke awal skrip Anda:
Perhatikan jarak antar
>
tanda. Bekerja untuk saya di GNU bash, versi 3.2.25 (1) -release (x86_64-redhat-linux-gnu)sumber
Saya kira pendekatan lain adalah sesuatu seperti ini:
sumber
Jika Anda ingin salinan output, Anda dapat menggunakan
tee
cara ini:Namun ini hanya akan mencatat stdout ke script.log. Jika Anda ingin memastikan stderr dan stdout diarahkan, gunakan:
Anda bahkan bisa membuatnya sedikit lebih bagus dengan fungsi kecil:
sumber
2>&1
keluar dan hanya pipa ke tee.Anda baru saja menggunakan ini:
Ini menampilkan semua untuk log itu, semuanya, serta menampilkannya di layar. Jika Anda ingin output LENGKAP, ini adalah bagaimana melakukannya.
Dan Anda dapat memutar ulang skrip jika Anda malas.
sumber
script
adalah paket, mis.sudo apt-get install script
untuk menginstalnya pada distro rasa Debian , jugascript -ac 'command opts' ~/Documents/some_log.script
dapat ditinjau dalam terminal melalui sesuatu sepertistrings ~/Documents/some_log.script | more
;strings
menjadi cara sederhana untuk melakukan pra-sanitasi beberapa hal yangscript
menyuntikkan untuk memungkinkan metode pemutaran ulang yang lebih menarik . Kalau tidak, jawaban yang solid @Fishy, karenascript
juga menjaga hal-hal interaktif juga.Anda dapat melihat lebih lanjut tentang cara kerjanya di sini: http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/
sumber
tee
.