Output dari -x menuju ke stderr, bukan stdout. Tetapi bahkan itu bisa menjadi masalah - banyak skrip akan memiliki dependensi fungsional pada konten stderr, dan jenisnya berantakan untuk memiliki debug dan stream stderr dicampur bersama dalam beberapa kasus.
Versi Bash> 4.1 memang menawarkan solusi yang berbeda: variabel lingkungan BASH_XTRACEFD memungkinkan Anda menentukan deskriptor file yang akan digunakan untuk mengirim aliran debug. Ini bisa berupa file atau pipa atau kebaikan unix-y lainnya yang Anda suka.
# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19
# turn on the debug stream:
set -x
# run some commands:
cd /etc
find
echo "Well, that was fun."
# Close the output:
set +x
exec 19>&-
# See what we got:
cat /tmp/my-script.log
Dengan sedikit mengutak-atik, Anda dapat melakukan hal-hal lain - seperti melakukan 'tee' pada stdout dan / atau stdin stream, dan interleave dengan output debug, sehingga log Anda lebih lengkap. Untuk detail lebih lanjut tentang ini, lihat /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
Keuntungan besar dari pendekatan ini daripada alternatif adalah Anda tidak mengambil risiko perubahan pada perilaku skrip Anda dengan menyuntikkan output debug ke stdout atau stderr.
exec 19>&-
)? Dalam pengalaman saya itu ditutup secara otomatis, ketika skrip selesai.set -x
tidak mengirim apa pun ke output standar, jadi tidak ada masalah di sana. Apa yang dilakukan adalah menulis kesalahan standar, yang pergi ke konsol secara default.Yang ingin Anda lakukan adalah mengarahkan stdout ke file lain, seperti ini:
sumber
Lihat
man tee
.Anda menjalankannya seperti itu
tee commandname filename
dan itu akan menampilkan output perintahstdout
dan menulisnya jugafilename
.sumber