Menggunakan bash, bagaimana cara menyalin stderr dan stdout ke file log dan juga membiarkannya ditampilkan di konsol?
Saya ingin melakukan ini di dalam skrip itu sendiri menggunakan exec.
Saya mencoba
exec &>> log.out
echo "This is stdout"
echo "This is stderr" >&2
Tetapi di atas tidak mencetak apa pun di konsol. Bagaimana saya bisa mencapai ini di bash?
Jawaban:
Anda sedang mencari
tee
.Lihat
man tee
detailnya.Untuk menggabungkannya
exec
, Anda harus menggunakan proses substitusi . (Lihatman bash
detailnya.)sumber
exec 2>&1 | tee -a log.out
hanya mencetak pada konsol, tidak ada dalam file log. Mungkin saya tidak menggunakan sintaks yang tepat?tee
dalam kombinasi dengan proses substitusi .the-script | wc -l
misalnya, itu juga akan menghitung garis kesalahan dan Anda tidak akan melihat kesalahan.Anda dapat melakukan:
Anda juga dapat menuliskannya sebagai:
Tetapi karena bash tidak menunggu proses-proses tersebut dimulai dengan
>(...
), yang memiliki efek buruk kadang-kadang mengeluarkan sesuatu ke terminal setelah perintah telah kembali yang dapat memiliki efek yang lebih buruk (seperti secara diam-diam membuang keluaran itu) jika terminal "untuk menghentikan" atribut aktif.Dalam kasus apa pun, dengan membuat
stdout
pipa di kedua solusi, dan karena dua perintah secara terpisah menampilkan output dan pesan kesalahan, ini akan mempengaruhi buffering output dan urutan output dan pesan kesalahan ditampilkan.sumber
tee -a log >&2 3>&-
Saya tahu ini adalah posting lama, tetapi mengapa tidak melakukan ini saja?
Dan tentu saja, jika Anda ingin stdout Anda hanya dapat mencetak secara teratur.
Anda dapat melakukan ini dengan kombinasi aliran apa pun yang Anda inginkan, cukup menggunakan dua perintah dasar itu.
Saya tahu saya datang ke sini dan tidak mendapatkan jawaban yang mudah dimengerti / diterapkan, semoga ini akan membantu orang lain yang sedang berjuang.
By the way, untuk noobs di luar sana seperti diri saya sebelumnya, semua
tee
perintah yang dilakukan adalah output input stdin ke stdout dan file yang ditentukan sebagai argumen berikutnya.-a
singkatan append, jadi Anda tidak menimpa file dengan setiap penggunaan perintah. Jika Anda memiliki pertanyaan lebih lanjut, saya menemukan ini sebagai sumber yang sangat membantu untuk mempelajari bash dengan cepat.sumber
Satu lagi cara melakukannya adalah menggunakan pengalihan dalam fungsi.
Di sini kita memiliki
main
fungsi yang memanggil semua fungsi lainnya. Sekarang mengarahkanSTDOUT
danSTDERR
darimain
fungsi untuktee
.sumber