Làm thế nào để tắt đầu ra trong một tập lệnh Bash?


149

Tôi có một chương trình xuất ra thiết bị xuất chuẩn và muốn tắt tiếng đầu ra đó trong tập lệnh Bash trong khi chuyển sang tệp.

Ví dụ: chạy chương trình sẽ xuất ra:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Tôi muốn đoạn script sau không xuất bất cứ thứ gì vào terminal:

#!/bin/bash
myprogram > sample.s

Từ những gì tôi nhớ lại, việc chuyển hướng đầu ra sang một tệp khiến nó không được lặp lại đến thiết bị đầu cuối. Những gì không làm việc cho bạn?
Anon.


Câu trả lời:


187

Nếu nó xuất ra stderr, bạn sẽ muốn im lặng điều đó. Bạn có thể làm điều đó bằng cách chuyển hướng mô tả tệp 2:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
Dòng "&>" là phiên bản ngắn hơn của những gì tôi vừa đăng. Tôi chưa từng đi qua lối tắt đó trước đây. Nâng cao.
chradcliffe

5
&>già hơn nhiều so với bash 4.
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams Bạn có thể liên kết phần &>giới thiệu tài liệu thay đổi không? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 chỉ ra rằng >>&đã được giới thiệu trong 4.0. Không có đề cập đến &>nhưng THAY ĐỔI chỉ quay trở lại 2.0 nên tôi nghĩ điều đó có nghĩa là nó đã ở 1.x.
tripleee

git blametrên redir.ccác điểm đến một cam kết năm 1998 cho lần xuất hiện cũ nhất vẫn còn trong cơ sở mã hiện tại.
tripleee

60

Chuyển hướng stderr sang stdout

Điều này sẽ chuyển hướng stderr (là mô tả 2) sang mô tả tập tin 1 là thiết bị xuất chuẩn.

2>&1

Chuyển hướng stdout sang File

Bây giờ khi thực hiện điều này, bạn đang chuyển hướng thiết bị xuất chuẩn vào tệp sample.s

myprogram > sample.s

Chuyển hướng stderr và stdout sang File

Kết hợp hai lệnh sẽ dẫn đến việc chuyển hướng cả stderr và stdout sang sample.s

myprogram > sample.s 2>&1

Chuyển hướng stderr và stdout sang / dev / null

Chuyển hướng đến /dev/nullnếu bạn muốn hoàn toàn im lặng ứng dụng của bạn.

myprogram >/dev/null 2>&1

13
Cái cuối cùng là thiếu một toán tử chuyển hướng; cần phải có myprogram >/dev/null 2>&1(chú ý nêm trước /dev/nullvà thứ tự các chuyển hướng).
tripleee

2
Sẽ không myprogram &>/dev/nullđủ?
JaviOverflow

38

Tất cả đầu ra:

scriptname &>/dev/null

Di động:

scriptname >/dev/null 2>&1

Di động:

scriptname >/dev/null 2>/dev/null

Đối với bash mới hơn (không có di động):

scriptname &>-

Điều này không hoạt động. Nó thực sự tạo ra một tập tin có tên -&>là một phần mở rộng vỏ bourne không di động.
PhilT

Tương đương di động echo moo 1>&-tạo ra lỗi vì mô tả tệp 1 đã bị đóng:-bash: echo: write error: Bad file descriptor
tripleee

11

Nếu bạn muốn STDOUT và STDERR cả [mọi thứ], thì cách đơn giản nhất là:

#!/bin/bash
myprogram >& sample.s

sau đó chạy nó như thế nào ./scriptvà bạn sẽ không nhận được đầu ra nào cho thiết bị đầu cuối của mình. :)

"> &" có nghĩa là STDERR và STDOUT. những &cũng hoạt động theo cách tương tự với một ống: ./script |& sed rằng sẽ gửi tất cả mọi thứ để sed


7
man bash (trong phần "Chuyển hướng đầu ra tiêu chuẩn và lỗi tiêu chuẩn") cho biết &> và> và tương đương nhưng ưu tiên (&>) đầu tiên. Tuy nhiên | & là cách duy nhất để làm điều này cho đường ống.
John Mellor

1
@ John Không, cách di động cho đường ống làa 2>&1 | b 2>&1 | c
tripleee

9

Nếu bạn vẫn đang loay hoay tìm câu trả lời, đặc biệt nếu bạn tạo một tệp cho đầu ra và bạn thích một giải pháp thay thế rõ ràng: echo "hi" | grep "use this hack to hide the oputut :) "


2
Hack thú vị ... nâng cao sự thông minh ^ _ ^
skplunkerin


0

Lưu ý: Câu trả lời này có liên quan đến câu hỏi "Cách tắt tiếng vang trong khi thực thi tập lệnh shell Linux", lần lượt được đánh dấu là trùng lặp với câu hỏi này.

Để thực sự tắt tiếng vang, lệnh là:

stty -echo

(ví dụ, đây là khi bạn muốn nhập mật khẩu và bạn không muốn nó có thể đọc được. Hãy nhớ bật tiếng vang ở cuối tập lệnh của bạn, nếu không, người chạy tập lệnh của bạn sẽ không thấy anh ta / cô gõ từ đó trở đi. Để bật echo khi chạy:

tiếng vang lớn


0

Hữu ích trong các kịch bản:


Chỉ nhận STDERR trong một tệp, trong khi ẩn bất kỳ STDOUT nào ngay cả khi chương trình ẩn hoàn toàn không tồn tại (không bao giờ treo tập lệnh gốc), chỉ riêng điều này đã hoạt động:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

Tách hoàn toàn và im lặng mọi thứ, thậm chí giết chết tập lệnh gốc sẽ không hủy bỏ ./prog:

 ./prog </dev/null >/dev/null 2>&1 &

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.