Chụp STDERR và STDOUT để gửi bằng tee


14

Tôi không rõ thứ tự tốt nhất là chụp cả hai STDERRSTDOUTvào cùng một tệp bằng cách sử dụng tee. Tôi biết rằng nếu tôi muốn chuyển sang tập tin, tôi phải ánh xạ tập tin sau khi chuyển hướng, tức là

find . >/tmp/output.txt 2>&1

Điều này hướng dẫn shell gửi STDOUTđến /tmp/output.txtvà sau đó gửi STDERRđến STDOUT(hiện đang gửi đến /tmp/output.txt).

Cố gắng thực hiện 2>&1trước khi chuyển hướng tệp sẽ không có hiệu quả mong muốn.

Tuy nhiên, khi tôi muốn sử dụng đường ống teethì nên:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?

Câu trả lời:


17

Cái sau; nó đảm bảo STDOUT và STDERR của lệnh ban đầu đi đến cùng fd, sau đó đưa chúng vào tee. Trong trường hợp trước, đó là STDERR của lệnh tee mà bạn sẽ tham gia với STDOUT của nó.


5
Điều thú vị là trang bash man nói: "Nếu |&được sử dụng, lỗi tiêu chuẩn của lệnh1 được kết nối với đầu vào tiêu chuẩn của lệnh2 thông qua đường ống; nó là tốc ký 2>&1 |. Việc chuyển hướng ngầm định này của lỗi tiêu chuẩn được thực hiện sau bất kỳ chuyển hướng nào được chỉ định bởi lệnh."
PP.

Tôi đã phải tạo ra một chương trình C nhỏ viết cả stderrstdoutđể hiểu vấn đề này. Các toán tử chuyển hướng >và tee |khác nhau khi cố gắng bắt cả hai luồng đầu ra. Để chuyển hướng tôi đã phải ./testapp > /tmp/out.log 2>&1. Trong khi đó cho tee tôi đã phải ./testapp 2>&1 | tee /tmp/out.log.
typelogic

@daixtr cho những gì nó có giá trị, |thường được gọi là một nhà điều hành đường ống. teechỉ đề cập đến chương trình cụ thể đang được gọi ở đầu xa của đường ống.
MadHatter
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.