Chuyển hướng cả stderr và stdout sang / dev / null với / bin / sh


61

Tôi đã thử tất cả các loại cách để chuyển hướng cả hai stdoutstderrđể /dev/nullmà không thành công. Tôi gần như cả đời chạy bash mà tôi chưa bao giờ gặp phải vấn đề này, nhưng lần đầu tiên trong BSD tôi bị mắc kẹt /bin/sh.

Những gì tôi đã thử:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... hoạt động; nếu Python không xuất hiện, nó sẽ tắt tiếng các thông báo lỗi từ ls. Tuy nhiên, nếu python.tgzcó, một dòng có đầu ra trông như thế này:

# ./test.sh
./python-2.7.3p1.tgz

Tôi đã thử:

if ls ./python* &> /dev/null; then
    echo found Python
fi

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

if ls ./python* > /dev/null; then
    echo found Python
fi

Không có gì thực sự hoạt động. Tôi chỉ có thể chuyển hướng một trong các đầu ra, không phải cả hai cùng một lúc.

Câu trả lời:


102

Điều này sẽ hoạt động trong mọi shell tương thích Posix:

ls good bad >/dev/null 2>&1

Bạn cần phải chuyển hướng stdout đầu tiên trước khi sao chép nó vào stderr ; nếu bạn nhân đôi nó trước, stderr sẽ chỉ vào những gì thiết bị xuất chuẩn ban đầu được chỉ ra.

Bash , zsh và một số shell khác cũng cung cấp lối tắt

ls good bad &>/dev/null

thuận tiện trên dòng lệnh nhưng nên tránh trong các tập lệnh dự định là di động.


1
Thật vậy, tôi đọc hướng dẫn sử dụng vỏ. Nó tuyên bố rằng các phiên bản sau này /bin/shđã thực hiện &>/dev/nullcú pháp, không phải là như vậy hoặc tôi có phiên bản cũ hơn (mà tôi không thể lặp lại bằng bất kỳ cách nào, chạy OpenBSD 5.3 tho nên là đủ)
Torxed

8
@Torxed, OpenBSD shdựa trên pdksh. Ngày nay không còn vỏ Bourne nữa. cshgiới thiệu >&cũng có sẵn trong zsh. bashđã chọn &>(hiện cũng được hỗ trợ bởi zshvà một số công pdkshcụ phái sinh) mặc dù nó rõ ràng phá vỡ sự tuân thủ POSIX vì foo &> filecú pháp POSIX hoàn toàn hợp lệ có nghĩa là một cái gì đó hoàn toàn khác.
Stéphane Chazelas

3
@ StéphaneChazelas (...) có nghĩa là một cái gì đó hoàn toàn khác Bạn để tôi tự hỏi nó có nghĩa gì trong trường hợp này ... :)
Piotr Dobrogost

4
@PiotrDobrogost, foo &> filegiống như foo & > filehoặc foo & : > file, được chạy foo trong nền và mở tệp để viết mà không có lệnh nào cả (không có khả năng được sử dụng như vậy).
Stéphane Chazelas

5
@PiotrDobrogost, >&không phải là lý tưởng, hoặc vì nó mâu thuẫn với >&2, >&-nhà khai thác. zshđã thêm nó để thuận tiện cho người dùng csh (csh không có >&2). Chúng chỉ là đường cú pháp, chỉ sử dụng > file 2>&1loại tiêu chuẩn và di động (với vỏ giống như Bourne).
Stéphane Chazelas
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.