Saya memiliki skrip yang menjalankan perintah seperti:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"
Masalahnya mungkin di pipa tee
. Tampaknya tidak mendapatkan seluruh output. Ketika aplikasi berhenti beberapa baris terakhir dari output (biasanya yang mengandung kesalahan fatal) hilang. Ketika saya menjalankan aplikasi tanpa pipa tee
saya mendapatkannya di output.
Bagaimana saya bisa memaksa skrip untuk menunggu tee menyelesaikan proses semua output?
Jawaban:
Kesalahan fatal mungkin muncul di STDERR (2), bukan STDOUT (1). Anda dapat mengarahkan kembali STDERR ke dalam STDOUT
2>&1
dan kemudian pipa tersebut akan menangkapnya juga.Jika Anda memiliki masalah buffering di bagian atas, Anda bisa memaksanya menjadi status tidak terbaca:
sumber
Karena pesan kesalahan biasanya ditampilkan pada STDERR (File descriptor 2), Anda perlu mengarahkan STDOUT dan STDERR ke
tee
:Ketika Anda melakukannya,
./some_app -i $INDEX | tee $LOG
Anda hanya mengarahkan STDOUT ketee
.|&
akan menyebabkan STDOUT dan STDERR dialihkan.Jika Anda tidak dapat mengarahkan kembali hanya STDOUT (Saat Anda dulu):
Di sisi lain, jika Anda hanya ingin mengarahkan ulang STDERR:
sumber