Làm cách nào để ẩn đầu ra của ứng dụng shell trong Linux?


Câu trả lời:


68

Bạn có thể chuyển hướng đầu ra của bất kỳ chương trình nào để nó không được nhìn thấy.

$ program > /dev/null

Điều này sẽ chuyển hướng đầu ra tiêu chuẩn - bạn vẫn sẽ thấy bất kỳ lỗi nào

$ program &> /dev/null

Điều này sẽ chuyển hướng tất cả đầu ra, bao gồm cả lỗi.


Người đầu tiên không làm việc cho wget
Jader Dias

Đó là nguyên nhân khiến wget sử dụng stderr cho một số đầu ra của nó. Cái thứ hai nên hoạt động.
theotherreceive

2
Ngẫu nhiên, bạn có thể muốn lưu đầu ra wget đó vào một tệp nhật ký, vì vậy khi / nếu quá trình tải xuống của bạn ngừng hoạt động, bạn có thể tìm hiểu tại sao. Nếu đó là trong một kịch bản nào. Nếu đây là loại chạy một lần, thì phải, vào thùng rác
Matt Simmons

1
Đối với wgetbạn có thể sử dụng các -qtùy chọn để làm cho nó yên tĩnh.
pkhamre

Bất kỳ cách nào để ngăn chặn đầu ra được ghi trực tiếp vào / dev / tty?
d11wtq

30

Có ba thiết bị IO có sẵn trên dòng lệnh.

 standard in - 0 
 standard out - 1 
 standard error - 2 

Để chuyển hướng tiêu chuẩn ra (đầu ra mặc định) sang một tệp (và ghi đè lên tệp), sử dụng

 command > file.log 

Để chắp thêm vào file.log, hãy sử dụng 2> s

 command >> file.log

để chuyển hướng lỗi tiêu chuẩn đến file.log, sử dụng

 command 2> file.log

và để chắp thêm

 command 2>> file.log

Để kết hợp các đầu ra thành một luồng và gửi tất cả chúng đến một nơi

 command > file.log 2>&1 

Điều này sẽ gửi 2 (stderr) thành 1 (stdout) và gửi stdout đến file.log

Lưu ý rằng cũng có thể chuyển hướng tiêu chuẩn thành một lệnh mong đợi stdin

 command << file.txt 

EDIT
Để biết thêm chi tiết, hãy xem Hướng dẫn về Script Bash nâng cao


Ai đó có thể giải thích làm thế nào các command > file.log 2>&1công trình?
Cory Klein

Bạn muốn biết mức độ thấp đến mức nào?
Matt Simmons

3
@nomoreink: thực tế là 2 lệnh, một là > filevà lệnh thứ hai là 2>&1. Cái đầu tiên chuyển hướng tiêu chuẩn ra một tập tin. Cái thứ hai lấy mô tả tập tin thứ 2 và chuyển hướng nó đến cái đầu tiên. Bạn có thể thực hiện ngược lại, chuyển hướng đầu ra tiêu chuẩn sang lỗi tiêu chuẩn bằng cách sử dụng >&2và sau đó chuyển hướng lỗi tiêu chuẩn sang một tệp với 2> file.
Hubert Kario

12

Ẩn giấu stdout

./command >/dev/null

Ẩn stdoutstderr

./command >/dev/null 2>&1

Ẩn stdoutstderrgiải phóng thiết bị đầu cuối (chạy lệnh trong nền)

./command >/dev/null 2>&1 &

3

Nếu bạn chỉ muốn ẩn đầu ra (và không lưu nó vào một tệp), bạn có thể sử dụng:

Đã chỉnh sửa:

$ lệnh &> / dev / null


Điều này sẽ chuyển hướng đầu ra đến một tệp có tên là null
thetherreceive

Nó tạo ra một tập tin null
Jader Dias

1
bạn sẽ không có ý / dev / null, phải không?
Babu

1
Vâng, tôi sẽ có, Babu. Ý tôi là $ lệnh &> / dev / null. Tôi xin lỗi vì gõ quá nhanh vì lợi ích của riêng tôi.
Lucho

2

Đối với Mac OS X (10.6 "Báo tuyết"):

Nếu bạn cần ẩn đầu ra mà không cho chương trình biết bằng cách kiểm tra bộ mô tả tệp đầu ra / lỗi, bạn có thể thử sử dụng cách sau trong shell:

stty flusho; command ;stty -flusho

hoặc nếu bạn chỉ muốn ẩn đầu vào từ thiết bị đầu cuối bằng cách này:

stty  -echo; command ;stty  echo

Xem trang hướng dẫn stty (1) để biết thêm thông tin

Đối với Linux, tất cả những gì tôi biết là Ubunutu (10.04 "Lucid") và một số "Debian / Arch" (nhận xét bên dưới - tnx hendry) không có flushocài đặt (và tôi không thể thấy bất kỳ điều gì phù hợp khác trong trang con người) . Các echothiết lập hoạt động trên Ubuntu anyway.


Stty mặc định của tôi trong Debian / Arch không có các tùy chọn này.
hendry

Tất nhiên tôi nên đề cập rằng tôi thậm chí không ở trên hệ điều hành của OP. Chỉnh sửa bài viết của tôi.
vike
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.