Saya tahu bahwa utilitas berperilaku baik seperti grep menampilkan pesan "normal" ke stdout, dan pesan kesalahan ke stderr.
$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
Ketika saya sedang menulis skrip shell sendiri, saya sering kesulitan memutuskan output apa dan pesan mana yang harus saya tampilkan di stderr, atau jika saya harus repot-repot sama sekali.
Saya ingin tahu tentang praktik yang baik: Kapan mengarahkan beberapa pesan ke stderr diperlukan dan masuk akal, dan kapan tidak?
"Itu tergantung", tentu, tetapi apakah Anda memiliki wawasan yang akan membantu saya membuat keputusan ini?
Untuk membuat pertanyaan subyektif ini sesuai dengan formatnya, saya ingin mendorong jawaban yang membahas "mengapa", dan diinformasikan oleh pengalaman dan jika mungkin didukung oleh fakta.
Jawaban:
Diam adalah emas. Tidak menghasilkan apa-apa jika semuanya baik-baik saja.
Cara termudah untuk memisahkan stderr dari stdout: bayangkan saja semua hasil skrip Anda akan diarahkan ke perintah lain melalui pipa. Dalam hal ini Anda harus menyimpan semua notifikasi di stderr, karena informasi yang tidak terduga di stdout dapat memutus urutan pipa.
Terkadang juga dalam pipa seperti ini:
Anda perlu meneruskan sesuatu dari
command2
ke hasil pengguna. Cara termudah tanpa file sementara adalah stderr.sumber
echo
beberapa variabel, tunjukkan apa yang telah dilakukan, tunjukkan kemajuan). Saya ragu untuk meletakkan semuanya di stderr karena semua ini adalah pesan skrip yang akan dihasilkan. Saya tidak yakin bagaimana menerapkan ide pipa dalam situasi ini.Saya biasanya menulis semua yang berhubungan dengan operasi aplikasi
stderr
,stdout
dicadangkan untuk data.Bayangkan aplikasi seperti
cat
. Ketika Anda menggunakannya untuk membaca input dan meneruskannya ke aplikasi lain (melalui pipa), Anda tidak ingin outputnya dikotori dengan pesan status.Segala sesuatu yang mungkin menarik untuk aplikasi lain atau postprocessor untuk aplikasi saya akan
stdout
, semua yang hanya berkaitan dengan interna aplikasi saya akanstderr
.sumber
Preferensi pribadi saya adalah mengirim pesan kesalahan dan pengecualian ke
stderr
dan pesan informasi kestdout
. IMO,stderr
untuk pengecualian apa pun dan karenanya, konvensi saya.sumber