Làm cách nào để chuyển hướng stderr và stdout sang các tệp khác nhau trong cùng một dòng trong tập lệnh?


180

Tôi biết điều này nhiều:

$ command 2>> error

$ command 1>> output

Có cách nào để tôi có thể xuất stderr sang tệp lỗi và xuất chuẩn cho tệp đầu ra trong cùng một dòng bash không?

Câu trả lời:


292

Chỉ cần thêm chúng trong một dòng command 2>> error 1>> output

Tuy nhiên, lưu ý rằng >>là để nối thêm nếu tệp đã có dữ liệu. Trong khi đó, >sẽ ghi đè lên bất kỳ dữ liệu hiện có trong tệp.

Vì vậy, command 2> error 1> outputnếu bạn không muốn nối thêm.

Chỉ để hoàn thành, bạn có thể viết 1>như >mô tả tệp mặc định là đầu ra. vì vậy 1>>là điều tương tự

Vì vậy, command 2> error 1> outputtrở thành,command 2> error > output


3
Câu trả lời chính xác! Tôi thực sự thích lời giải thích của bạn về cách 1>có thể được viết là>
user784637

Làm thế nào là khác nhau như thế này command &2>err.log, tôi nghĩ rằng tôi hoàn toàn khó hiểu sintaxies. (Một liên kết đến một câu trả lời thích hợp của tất cả các bash pipe-isms có thể theo thứ tự)
ThorSummoner

4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html là những gì tôi nghĩ bạn đang tìm kiếm. Fwiw, có vẻ như command &2>err.logkhông hoàn toàn hợp pháp - dấu và trong cú pháp đó được sử dụng cho bộ mô tả tệp làm mục tiêu, ví dụ: command 1>&2sẽ định tuyến lại thiết bị xuất chuẩn đến thiết bị lỗi chuẩn.
DreadPirateShawn

@DreadPirateShawn, vui lòng không liên kết ABS làm tài liệu tham khảo - đôi khi nó chứa những điểm không chính xác hoàn toàn và rất thường xuyên chứa các ví dụ thực tiễn xấu. wiki.bash-hackers.org/howto/redirection_tutorial là một xa nguồn tài liệu tham khảo tốt hơn trên chuyển hướng.
Charles Duffy

27

Thử cái này:

your_command 2>stderr.log 1>stdout.log

Thêm thông tin

Các chữ số 0thông qua 9mô tả tập tin trong bash. 0là viết tắt của đầu vào tiêu chuẩn, 1là viết tắt của đầu ra tiêu chuẩn, 2là viết tắt của lỗi tiêu chuẩn. 3thông qua 9là phụ tùng cho bất kỳ việc sử dụng tạm thời khác.

Bất kỳ bộ mô tả tệp nào cũng có thể được chuyển hướng đến một tệp hoặc tới một bộ mô tả tệp khác bằng toán tử >. Thay vào đó, bạn có thể sử dụng toán tử >>để nối vào một tệp thay vì tạo một tệp trống.

Sử dụng:

file_descriptor > filename

file_descriptor > &file_descriptor

Vui lòng tham khảo chi tiết Bash-Scripting Guide: Chương 20. I / O Redirection .


Thanks.i tìm kiếm cái này trong một giờ
dılo sürücü


9

Hoặc nếu bạn muốn trộn các kết quả đầu ra (stdout & stderr) trong một tệp duy nhất bạn có thể muốn sử dụng:

command > merged-output.txt 2>&1

32
Đây không phải là một câu trả lời cho câu hỏi.
Matthias

Tại sao mọi người hợp nhất đầu ra hoặc đề xuất đầu ra hợp nhất?
Nurettin

@nurettin: có thể bạn có một dòng script chỉ thực thi một lệnh và ngay lập tức lưu đầu ra vào một tệp nhật ký. Lệnh trong câu hỏi đôi khi có thể thất bại vì vậy bạn cũng muốn lưu bất kỳ lỗi nào về điều đó nhưng vào cùng một tệp nhật ký.
streamofstars

@streamofstars tất nhiên bạn đúng, đôi khi đó là điều mọi người muốn, tôi đã bình luận trong bối cảnh của câu hỏi này khi một người đang tìm kiếm câu trả lời và tìm thấy rất nhiều câu hỏi không liên quan trên stackoverflow.
Nurettin

0

Đầu ra của nhiều lệnh có thể được chuyển hướng. Điều này hoạt động cho cả dòng lệnh hoặc hữu ích nhất trong tập lệnh bash. Các -schỉ dẫn nhắc mật khẩu đến màn hình.

Hereblock cmds stdout / stderr được gửi đến các tệp riêng biệt và không có gì để hiển thị.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmds stdout / stderr được gửi đến một tệp duy nhất và hiển thị.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Hereblock cmds stdout / stderr được gửi đến các tệp riêng biệt và thiết bị xuất chuẩn để hiển thị.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

Tùy thuộc vào bạn là ai (whoami) và tên người dùng, mật khẩu có thể được yêu cầu hoặc không.

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.