gửi đầu ra tới / dev / stderr so với> & 2


11

Trong các tập lệnh, lỗi thường được gửi đến tập tin mô tả 2 với &2, nghĩa là:

echo "error" >&2

Đôi khi /dev/stderrđược sử dụng thay thế:

echo "error" > /dev/stderr 

Nhìn vào /dev/stderr, tôi thấy rằng nó chỉ là một liên kết tượng trưng /proc/self/fd/2, đến lượt nó là một liên kết tượng trưng đến /dev/pts/5(trên thiết bị đầu cuối hiện tại của tôi).

Có vẻ hơi phức tạp. Có một số logic đằng sau đó?

Là sử dụng /dev/stderr&2tương đương?

Có ai trong số những người ưa thích hơn những người khác?


3
echo "error" >2tạo ra một tập tin với tên 2và nội dung error.
Cyrus


Tôi thấy bản chỉnh sửa của mình được giới thiệu lại & 2 thay vì 2. Câu hỏi của bạn có thực sự về việc sử dụng >2hay >&2không?
Jeff Schaller

Câu trả lời:


13

Thiết bị đặc biệt dành riêng cho /dev/stderrhệ thống, trong khi bộ mô tả tệp 2(không phải thiết bị đặc biệt /proc/self/fd/2) có thể mang theo được. Nếu bạn muốn viết mã không di động, những thiết bị đặc biệt đó là một nơi tốt để bắt đầu.

Có một vài hệ thống với /dev/stderr: Linux, tất nhiên và OSX . Nhưng OSX không có /prochệ thống tập tin và nó /dev/stderrlà một liên kết đến /dev/fd/2.

Đọc thêm:


Cũng có trường hợp ai đó muốn làm, ví dụ. cái này 2> bla.logsẽ hoạt động miễn là bạn chuyển sang 2và không mã cứng /dev/stderr. Về cơ bản 2không cần phải là stderrđầu ra.
larkey

6

Trong bash và các shell khác, cách để chuyển hướng một cái gì đó sang lỗi tiêu chuẩn là sử dụng >&2. Bash mở ra /dev/stderrnhư mô tả tập tin 2 . File descriptor được tham chiếu bởi &Nnơi Nlà số của bộ mô tả. Vì vậy, echo error >&2sẽ in errorlỗi tiêu chuẩn, để /dev/stderr.

Nó cũng sẽ mở /dev/stdoutnhư mô tả tập tin 1. Điều này có nghĩa là bạn có thể làm echo output >&1. Tuy nhiên, vì mọi thứ được in theo đầu ra tiêu chuẩn theo mặc định, điều đó cũng giống như echo outputchính nó.

Bây giờ, 2>là khác nhau. Ở đây, bạn đang chuyển hướng đầu ra lỗi của một lệnh khác. Vì vậy, 2>filecó nghĩa là "chuyển hướng bất cứ điều gì được in sang mô tả tệp 2 (lỗi tiêu chuẩn) đến file".


3

Bạn nói đúng, >&2là "thành ngữ" trực tiếp và hoàn hảo hơn. Chúng nên tương đương nhau, vì vậy không có lý do cụ thể để sử dụng >/dev/stderr. Ngoại trừ điều đó, nếu ai đó đọc không biết những gì họ làm, một trong số họ có thể dễ dàng tìm ra hơn những người khác :-). Nhưng nói chung tôi khuyên bạn nên sử dụng >&2.

/ dev / stderr có thể hữu ích khi các chương trình sẽ ghi lỗi vào một tên tệp được chỉ định, nhưng không hỗ trợ stderr. Rõ ràng đây là một chút giả định; / dev / stdout hữu ích hơn nhiều. (Gần đây tôi thấy mysql_safetập lệnh trình bao bọc sẽ không ghi lỗi vào bảng điều khiển; tiếc là nó cũng muốn thay đổi quyền trên tệp nhật ký lỗi, do đó, việc sử dụng / dev / stderr gây ra một vài cảnh báo không cần thiết).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.