Tại sao việc chuyển hướng STDERR sang / dev / null được thực hiện theo cách này?


28

Điều này không có ý nghĩa với tôi.

wibble > /dev/null 2>&1

Tôi nghĩ nó sẽ có ý nghĩa hơn nếu nó là một cái gì đó như thế này:

wibble 2>&1 > /dev/null

Nói cách khác

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Suy nghĩ đằng sau thứ tự chuyển hướng lệnh là xxx > /dev/null 2>1gì?


6
Bạn cũng có thể thấy lời giải thích này hữu ích.
rozcietrzewiacz

Cảm ơn @rozcietzewiacz đã thực sự giải thích chính xác câu hỏi của tôi
whoami

1
Có một đoạn văn tuyệt vời ở giữa trang đó trên Wiki của Greg: Tại thời điểm này, bạn vẫn còn bối rối, có lẽ vì bạn đã bắt đầu với một quan niệm sai lầm về cách thức hoạt động của FD và bạn đã không thể bỏ qua quan niệm sai lầm đó chưa. Đừng lo lắng - đó là một quan niệm sai lầm cực kỳ phổ biến và bạn không đơn độc. Nhiều người nghĩ rằng 2>&1bằng cách nào đó, người Viking kết hợp các mối quan hệ của nhau hoặc với nhau, hoặc kết hôn với hai người, do đó, bất kỳ sự thay đổi [tiếp theo] nào với họ sẽ trở thành một sự thay đổi đối với người kia. Đây không phải là trường hợp. Hãy
G-Man nói 'Tái lập lại Monica'

Câu trả lời:


40

Các chuyển hướng được xử lý từ trái sang phải. Nếu bạn làm

2>&1 1> /dev/null

Chuyển hướng đầu tiên làm cho stderrđiểm đến luồng stdouttrỏ đến tại thời điểm đó (về cơ bản là tty của bạn). Nó không tạo ra stderrbí danh stdout.

Sau đó stdoutđược chuyển hướng đến thùng bit. Các stdoutchuyển hướng không ảnh hưởng đến trước stderrchuyển hướng. stderrvẫn đề cập đến tty của bạn.

Vì thế:

ls file_that_doesnt_exist 2>&1 1> /dev/null

sẽ chỉ in thông báo lỗi trên thiết bị đầu cuối của bạn.

Các bashtrang tài liệu chuyển hướng đề cập này một cách rõ ràng:

Lưu ý rằng thứ tự chuyển hướng là đáng kể. Ví dụ: lệnh

          ls > dirlist 2>&1

hướng cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn vào danh sách tập tin, trong khi lệnh

          ls 2>&1 > dirlist

chỉ hướng đầu ra tiêu chuẩn vào danh sách dirlist, vì lỗi tiêu chuẩn được nhân đôi từ đầu ra tiêu chuẩn trước khi đầu ra tiêu chuẩn được chuyển hướng đến dirlist .


3
Yay giải quyết câu hỏi hóc búa của tôi. Tôi vẫn nghĩ một cách logic. nhưng tôi đã tìm thấy một phần khác trên cùng một trang thú vị &>/dev/nulllà tương đương về mặt ngữ nghĩa với/dev/null 2>&1
whoami

1
Cần nhấn mạnh rằng trang bạn đang nói đến là một phần của Hướng dẫn tham khảo Bash . Nó, rõ ràng, mô tả bash . Có vỏ khác trên thế giới, khác nhau từ bash, và &>>&(khi không được sử dụng trong bối cảnh 2>&1hay >&2, vv) là bash-ISMS và không phải là tiêu chuẩn . Chúng không nên được sử dụng trong các kịch bản shell mà bạn muốn có thể mang theo được.
G-Man nói 'Phục hồi Monica'
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.