Câu hỏi Làm thế nào tôi có thể chuyển hướng và nối thêm cả stdout và stderr vào một tệp với Bash?


Để chuyển hướng stdout vào một tệp bị cắt ngắn trong Bash, tôi biết sử dụng:

cmd > file.txt

Để chuyển hướng stdout trong Bash, gắn thêm vào một tệp, tôi biết sử dụng:

cmd >> file.txt

Để chuyển hướng cả hai stdout và stderr vào một tệp bị cắt ngắn, tôi biết sử dụng:

cmd &> file.txt

Làm cách nào để chuyển hướng cả hai stdout và stderr phụ thêm vào một tập tin? cmd &>> file.txt không làm việc cho tôi.


1184
2018-05-18 04:19


gốc


Tôi muốn lưu ý rằng & outfile là một mã Bash (và những người khác) cụ thể và không di động. Con đường di chuyển (tương tự như các câu trả lời phụ thêm) luôn luôn và vẫn là> outfile 2> & 1 - TheBonsai


Các câu trả lời:


cmd >>file.txt 2>&1

Bash thực hiện các chuyển hướng từ trái sang phải như sau:

  1. >>file.txt: Mở file.txt trong chế độ nối thêm và chuyển hướng stdout đó.
  2. 2>&1: Chuyển hướng stderr đến "Ở đâu stdout hiện đang đi ". Trong trường hợp này, đó là một tệp được mở trong chế độ nối thêm. Nói cách khác, &1 reuses bộ mô tả tập tin stdout hiện đang sử dụng.

1561
2018-05-18 04:23



hoạt động tuyệt vời! nhưng có một cách để làm cho tinh thần này hoặc tôi nên đối xử với điều này giống như một cấu trúc bash nguyên tử? - flybywire
Chuyển hướng đơn giản, các câu lệnh chuyển hướng được đánh giá, như mọi khi, từ trái sang phải. >> tệp: Màu đỏ. STDOUT để gửi (chế độ nối thêm) (viết tắt cho 1 >> tệp) 2> & 1: Đỏ. STDERR để "nơi stdout đi" Lưu ý rằng việc diễn giải "chuyển hướng STDERR đến STDOUT" là sai. - TheBonsai
Nó nói "nối thêm đầu ra (stdout, tập tin mô tả 1) vào file.txt và gửi stderr (tập tin mô tả 2) đến cùng một vị trí như fd1". - Dennis Williamson
Điều đó thậm chí hoạt động trong zsh. Cảm ơn. - Mark
nếu bạn làm cmd >>file1 2>>file2 nó sẽ đạt được những gì bạn muốn. - Woodrow Douglass


Có hai cách để thực hiện việc này, tùy thuộc vào phiên bản Bash của bạn.

Cổ điển và di động (Bash trước 4) là:

cmd >> outfile 2>&1

Một cách không thể di chuyển, bắt đầu bằng Bash 4 Là

cmd &>> outfile

(tương tự với &> outfile)

Đối với phong cách mã hóa tốt, bạn nên

  • quyết định nếu tính di động là một mối quan tâm (sau đó sử dụng cách cổ điển)
  • quyết định nếu tính di động ngay cả với Bash trước-4 là một mối quan tâm (sau đó sử dụng cách cổ điển)
  • không có vấn đề cú pháp bạn sử dụng, không thay đổi nó trong cùng một kịch bản (nhầm lẫn!)

Nếu tập lệnh của bạn đã bắt đầu bằng #!/bin/sh (không có vấn đề nếu dự định hay không), sau đó là giải pháp Bash 4, và nói chung bất kỳ mã cụ thể Bash, không phải là con đường để đi.

Cũng nên nhớ rằng Bash 4 &>> chỉ là cú pháp ngắn hơn - nó không giới thiệu bất kỳ chức năng mới hoặc bất cứ điều gì như thế.

Cú pháp là (bên cạnh cú pháp chuyển hướng khác) được mô tả ở đây: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output


298
2018-05-18 04:42



Tôi thích & >> vì nó phù hợp với &> và >>. Nó cũng dễ dàng hơn để đọc 'nối thêm đầu ra và lỗi vào tệp này' hơn 'gửi lỗi tới đầu ra, nối thêm đầu ra vào tệp này'. Lưu ý trong khi Linux thường có phiên bản bash hiện tại, OS X, tại thời điểm viết, vẫn yêu cầu bash 4 để cài đặt thủ công qua homebrew, v.v. - mikemaccana
Tôi thích nó nhiều hơn bởi vì nó ngắn hơn và chỉ tweoi địa điểm trên mỗi dòng, vì vậy những gì sẽ cho ví dụ zsh làm ra "& >>"? - Phillipp
Cũng quan trọng cần lưu ý, rằng trong một công việc định kỳ, bạn phải sử dụng cú pháp trước 4, ngay cả khi hệ thống của bạn có Bash 4. - hyperknot
@zsero cron không sử dụng bash ở tất cả ... nó sử dụng sh. Bạn có thể thay đổi shell mặc định bằng cách thêm vào SHELL=/bin/bash đến crontab -e tập tin. - Ray Foss


Trong Bash bạn cũng có thể chỉ định rõ ràng các chuyển hướng của bạn đến các tệp khác nhau:

cmd >log.out 2>log_error.out

Phụ thêm sẽ là:

cmd >>log.out 2>>log_error.out

76
2017-07-24 18:09



Việc chuyển hướng hai luồng tới cùng một tệp bằng tùy chọn đầu tiên của bạn sẽ khiến cho luồng đầu tiên viết "trên đầu" của phần thứ hai, ghi đè một số hoặc tất cả nội dung. Sử dụng cmd >> log.out 2> log.out thay thế. - Orestis P.
Cảm ơn vì đã bắt được điều đó; bạn nói đúng, người ta sẽ ăn cắp cái kia. Tuy nhiên, lệnh của bạn cũng không hoạt động. Tôi nghĩ cách duy nhất để ghi vào cùng một tệp như đã được đưa ra trước đây cmd >log.out 2>&1. Tôi đang chỉnh sửa câu trả lời của mình để xóa ví dụ đầu tiên. - Aaron R.


Trong Bash 4 (cũng như ZSH 4.3.11):

cmd &>>outfile

chỉ cần ra khỏi hộp


57
2018-03-27 18:24



@AoeAoe: Điều này thực sự hoạt động trong Bash 4 quá. - mk12
@all: đây là một câu trả lời hay, vì nó hoạt động với bash và ngắn gọn, vì vậy tôi đã chỉnh sửa để đảm bảo nó đề cập đến bash một cách rõ ràng. - mikemaccana
@mikemaccana: Câu trả lời của TheBonsai cho thấy giải pháp bash 4 từ năm 2009 - jfs


Điều này sẽ hoạt động tốt:

your_command 2>&1 | tee -a file.txt

Nó sẽ lưu trữ tất cả các bản ghi trong file.txt cũng như đổ chúng trên thiết bị đầu cuối.


33
2017-12-12 06:17





Thử cái này

You_command 1>output.log  2>&1

Việc bạn sử dụng &> x.file không hoạt động trong bash4. xin lỗi vì chuyện đó : (

Ở đây có một số mẹo bổ sung.

0, 1, 2 ... 9 là các bộ mô tả tập tin trong bash.

0 là viết tắt của stdin, 1 là viết tắt của stdout, 2 là viết tắt của stderror. 3 ~ 9 là phụ tùng cho bất kỳ 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 bộ mô tả tệp hoặc tệp khác bằng cách sử dụng toán tử > hoặc là >>(phụ thêm).

Sử dụng: <file_descriptor> > <tên tệp | & file_descriptor>

Vui lòng tham khảo http://www.tldp.org/LDP/abs/html/io-redirection.html


19
2018-04-10 05:56



Ví dụ của bạn sẽ làm một cái gì đó khác với OP yêu cầu: Nó sẽ chuyển hướng stderr của You_command để stdout và stdout của You_command vào tập tin output.log. Ngoài ra nó sẽ không gắn thêm vào tệp nhưng nó sẽ ghi đè lên nó. - pabouk
Chính xác: Trình mô tả tệp có thể là bất kỳ giá trị nào lớn hơn 3 cho tất cả các tệp khác. - Itachi
Câu trả lời của bạn cho thấy lỗi chuyển hướng đầu ra phổ biến nhất: chuyển hướng STDERR đến nơi STDOUT hiện trỏ và chỉ sau đó chuyển hướng STDOUT thành tệp. Điều này sẽ không làm cho STDERR được chuyển hướng đến cùng một tệp. Thứ tự của các chuyển hướng quan trọng. - Jan Wikholm
nó có nghĩa là, trước tiên tôi nên chuyển hướng STDERROR đến STDOUT, sau đó chuyển hướng STDOUT đến một tập tin. 1 > output.log 2>&1 - Quintus.Zhou
@ Quintus.Zhou Yup. Phiên bản của bạn chuyển hướng sai lệch ra ngoài và đồng thời ra tệp. - Alex Yaroshevich