Saya memiliki skrip shell set -x
untuk memiliki keluaran verbose / debug:
#!/bin/bash
set -x
command1
command2
...
Outputnya terlihat seperti ini:
+ command1
whatever output from command1
+ command2
whatever output from command2
Masalah saya adalah, output shell (disebabkan oleh set -x
) pergi ke stderr, dicampur dengan output dari perintah ( command1
, command2
, ...). Saya akan senang memiliki output "normal" di layar (seperti skrip dijalankan tanpa set -x
) dan output "ekstra" dari bash secara terpisah dalam file.
Jadi saya ingin memiliki ini di layar:
whatever output from command1
whatever output from command2
dan ini dalam file log:
+ command1
+ command2
(juga baik jika file log memiliki semuanya)
The set -x 2> file
jelas Doens't mengambil efek yang tepat, karena itu bukan output dari perintah set, tapi mengubah perilaku bash.
Menggunakan bash 2> file
untuk seluruh skrip juga tidak melakukan hal yang benar, karena itu mengarahkan ulang stderr dari setiap perintah yang berjalan di shell ini juga, jadi saya tidak melihat pesan kesalahan dari perintah.
sumber
Jawaban:
Berdasarkan jawaban ServerFault ini. Kirim bash -x output ke logfile tanpa menginterupsi output standar , versi bash modern menyertakan secara
BASH_XTRACEFD
spesifik untuk menentukan deskriptor file alternatif untuk output dariset -x
Jadi misalnya bisa Anda lakukan
untuk mengirim output
set -x
ke filelogfile
sambil mempertahankan output standar reguler dan stream kesalahan standar untuk perintah berikut.Perhatikan bahwa penggunaan fd 19 adalah arbitrer - hanya perlu deskriptor yang tersedia (yaitu bukan 0, 1, 2 atau nomor lain yang telah Anda alokasikan).
sumber
Setelah lebih dari setahun saya telah menemukan solusi yang tepat untuk memiliki keluaran "normal" (stdout + stderr - jejak bash) di layar dan semuanya bersama-sama (stdout + stderr + jejak bash) dalam sebuah file (bash.log) :
sumber
Steeldriver memberimu satu pendekatan. Atau, Anda dapat mengarahkan STDERR ke file:
Namun, itu berarti bahwa output yang dibuat oleh
set -x
opsi dan pesan kesalahan lainnya yang dihasilkan akan masuk ke file. Solusi Steeldriver hanya akan mengarahkan ulangset -x
output yang mungkin Anda inginkan.sumber