Saya ingin melihat output dari perintah di terminal seolah-olah tidak ada pengalihan. Juga, stderr perlu diarahkan ke err.log dan stdout perlu diarahkan ke stdout.log.
Akan lebih baik juga memiliki salinan yang tepat dari apa yang ditampilkan di terminal, yaitu kesalahan dicetak sebagai dan ketika itu terjadi, dalam file terpisah: stdouterr.log.
bash
logs
io-redirection
balki
sumber
sumber
Jawaban:
Gunakan
tee
perintah sebagai berikut:3>&1 1>&2 2>&3
adalah cara Anda bertukar stderr dan stdout, karena tee hanya dapat menerima stdout.Lihatlah perintah tee Unix untuk pengalihan lebih lanjut menggunakan
tee
.sumber
cmd
dengan(cmd ; echo >exit_code.txt $?)
.((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
Saya pikir masuk stdout dan stderr ke dua file yang berbeda adalah ide bagus. Apakah itu tidak membuat log asinkron? Jadi saya mencoba yang berikut ini:
((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log
di terminal lain
sumber
&| tee all.log
pada akhir perintah daripada&> all.log
&|
. Saya mengerti&>
,|&
juga, tapi apa&|
artinya dalam konteks ini? Saya tidak dapat menemukan referensi sintaksis yang cocok, tidak di internet, bahkan tidak melihat halaman manual bash "bash (1)" ... Tx|&
@ Duke, Terima kasih.
Saya menemukan cara lain juga yang menghemat sekitar aliran dalam urutan karena mereka akan dicetak tanpa pengalihan.
command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog
Tetapi ini hanya bekerja pada cangkang yang mendukung substitusi proses.
sumber
coba ini :
sumber