2014-07-13 23 views
7

Khi chạy dos2unix trên một tập tin tôi nhận được những sản phẩm sau in để nhà gaTại sao dos2unix in ra stderr?

dos2unix: converting file <filename> to UNIX format ... 

Trong nỗ lực của tôi để ngăn chặn đầu ra bằng cách gửi nó đến/dev/null Tôi nhận thấy rằng đây được gửi ra trên stderr thay vì stdout như tôi mong đợi (vì nó có vẻ như một thông điệp bình thường, không phải là một lỗi). Có một lý do cho điều này?

+0

Bạn sẽ thấy rằng unix chứa đầy các tạo tác lịch sử, chẳng hạn như tại sao 'dd' yêu cầu đối số như' if = ... 'và tại sao' tar' yêu cầu đối số vị trí không có '-' dẫn đầu. Nó chỉ là cách nó là ... –

+3

Trong trường hợp bạn chưa tìm thấy nó, bạn có thể ngăn chặn đầu ra này bằng cách sử dụng cờ '--quiet' – ebo

+0

Bởi vì nó là chán.Nhưng trong quá khứ, bạn có thể chỉ cần đầu vào đường ống vào nó và đường ống ra. Các lỗi được yêu cầu đặt trong stderr –

Trả lời

5

Trong môi trường Unix-như người ta thường chuỗi quy trình: Kết quả của một chương trình được sử dụng làm đầu vào cho một chương trình khác. Trộn kết quả với chẩn đoán sẽ gây nhầm lẫn cho giai đoạn xử lý tiếp theo. Nó cũng sẽ ẩn các chẩn đoán từ một người dùng tiềm năng xem thiết bị đầu cuối, nơi các kết quả xử lý được truyền đến chương trình tiếp theo không hiển thị.

Đây là lý do cho việc tách kết quả và chẩn đoán trong stdout và stderr. Chẩn đoán không bị hạn chế về lỗi nhưng phải chứa mọi thứ không phải là kết quả xử lý mà các chương trình tiếp theo mong đợi.

Đối với câu hỏi thực tế: dos2unix thường được sử dụng để chuyển đổi tệp tại chỗ nhưng cũng có thể xuất thành stdout (khi được gọi không có tên tệp, nó đọc từ stdin và đầu ra thành stdout). stdout sau đó có thể được chuyển hướng độc lập từ stderr. Hãy xem xét cat blados | dos2unix > blaunix. Bạn vẫn sẽ thấy chẩn đoán (có thể chứa thông báo lỗi!), Nhưng kết quả của quá trình xử lý sẽ chuyển sang blaunix.

Nó không quá phổ biến để in chẩn đoán ở tất cả trong trường hợp thành công — có thể là một chút thích nghi cho người dùng DOS. Nó sẽ là khá xấu nếu kết quả xử lý chứa thông tin thông tin; ví dụ, nó sẽ phá vỡ một tập tin C.

6

Không có lý do gì, nhưng thông thường stderr không chỉ dành cho đầu ra lỗi. Đó là một luồng khác thường được sử dụng để ghi nhật ký hoặc thông báo thông tin. Vì thông điệp tường trình không phải là đầu ra, nó không được gửi đến stdout, đó là kết quả của chương trình.

Lý do được in trên thiết bị đầu cuối của bạn là kết quả của trình bao, và không thực sự được kiểm soát bởi ứng dụng.

+2

Tôi đặt cược rằng dos2unix được sử dụng thủ công bằng cách sử dụng 'tr -d' \ r '< file > file2', trong trường hợp này stdin và stdout đã bận. –

3

Đơn giản bởi vì đó là cách nó được thực hiện ...

Nếu bạn sẽ kiểm tra the source-code bạn sẽ thấy:

... 
if (!pFlag->Quiet) 
    fprintf(stderr, _("dos2unix: converting file %s to file %s in UNIX format ...\n"), argv[ArgIdx-1], argv[ArgIdx]); 

... 
+1

Và vì nó là [phần mềm miễn phí] (https://en.wikipedia.org/wiki/Free_software), bạn có thể cải thiện mã nguồn để phù hợp với nhu cầu của mình (nhưng có lẽ bạn nên xuất bản các bản vá của mình ...) –

+0

Mặc dù nói đúng câu hỏi không phải là liệu nó có được thực hiện hay không (nhưng điều đó là hiển nhiên), nhưng * tại sao *. Kết quả là, người ta có thể lập luận rằng câu trả lời của bạn ít hơn một câu trả lời hơn là xác nhận của tiểu bang. Tuy nhiên tốt đẹp để tìm nó lên. –

1

Tôi sử dụng một lớp lót này để chuyển hướng stderr đến stdout, bỏ qua dòng đầu tiên không liên quan và gửi phần còn lại trở lại vào stderr.

dos2unix thefile 2>&1|tail -n+2 1>&2

0
Try dos2unix -q <filename> 

-q, --quiet chế độ im lặng. Suppress tất cả các cảnh báo và tin nhắn. Giá trị trả về bằng không. Ngoại trừ khi các tùy chọn dòng lệnh sai được sử dụng.

Các vấn đề liên quan