Có một POSIX, GNU hoặc hướng dẫn chính thức nào về nơi báo cáo tiến trình và thông tin đăng nhập (những thứ như "Làm foo; foo xong") nên được in không? Cá nhân, tôi có xu hướng viết chúng vào thiết bị xuất chuẩn để tôi có thể chuyển hướng thiết bị xuất chuẩn và chỉ nhận đầu ra thực tế của chương trình. Gần đây tôi đã nói rằng đây không phải là thông lệ tốt vì các báo cáo tiến độ không thực sự có lỗi và chỉ nên in thông báo lỗi cho thiết bị lỗi chuẩn.
Cả hai vị trí đều có ý nghĩa, và tất nhiên bạn có thể chọn cái này hay cái kia tùy thuộc vào chi tiết của những gì bạn đang làm, nhưng tôi muốn biết liệu có một tiêu chuẩn thường được chấp nhận cho việc này không. Tôi chưa thể tìm thấy bất kỳ quy tắc cụ thể nào trong POSIX, các tiêu chuẩn mã hóa GNU hoặc bất kỳ danh sách thực tiễn tốt nhất nào được chấp nhận rộng rãi như vậy.
Chúng tôi có một vài câu hỏi tương tự, nhưng chúng không giải quyết được vấn đề chính xác này:
Khi nào nên sử dụng chuyển hướng đến thiết bị xuất chuẩn trong tập lệnh shell : Câu trả lời được chấp nhận cho thấy những gì tôi có xu hướng làm, giữ đầu ra cuối cùng của chương trình trên thiết bị xuất chuẩn và bất cứ điều gì khác cho thiết bị xuất chuẩn. Tuy nhiên, điều này chỉ được trình bày dưới dạng ý kiến của người dùng, mặc dù được hỗ trợ bởi các đối số.
Thông điệp sử dụng nên đi đến thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn? : Điều này là cụ thể để giúp thông báo nhưng trích dẫn tiêu chuẩn mã hóa GNU. Đây là loại điều tôi đang tìm kiếm, chỉ không bị hạn chế để chỉ giúp đỡ tin nhắn.
Vì vậy, có bất kỳ quy tắc chính thức nào về nơi báo cáo tiến độ và thông báo thông tin khác (không phải là một phần của đầu ra thực tế của chương trình) nên được in không?
stdout
thực sự là một cách an toàn và đúng đắn để pringing spinners và các thông điệp thông tin khác, nhưng như nhiều lập trình viên nói 'Im lặng là vàng. Đầu ra không có gì nếu mọi thứ đều ổn. ' Vì vậy, trên thực tế, stderr luôn được sử dụng để làm điều đó vì định nghĩa mơ hồ và cũng là thiết bị xuất chuẩn có thể phá vỡ chuỗi ống. Đối với hướng dẫn chính thức
stderr
để báo cáo các thông báo lỗi, ngoại trừ khi --verbose
sử dụng cờ, tại đó cũng bao gồm các báo cáo tiến trình.
stdout
cùng với kết quả là một cách an toàn để làm cho kết quả vô dụng. Nếu bạn cần chuyển kết quả sang một số chương trình khác, chương trình cho biết sẽ cần tách kết quả khỏi các spinners. Ngoài ra, nếu bạn chuyển hướng đầu ra sang một tệp, bạn sẽ không thể thấy các spinners. IMHO.