Làm thế nào để chuyển hướng đầu ra đến nhiều tệp nhật ký


52

Làm thế nào để chuyển hướng đầu ra tiêu chuẩn đến nhiều tệp nhật ký? Những điều sau đây không hoạt động:

some_command 1> output_log_1 output_log_2 2>&1

6
Với zsh, bạn có thể sử dụng some_command >output_log_1 >output_log_2.
jofel

Câu trả lời:


70

Xem man tee:

NAME: tee - đọc từ đầu vào tiêu chuẩn và ghi vào đầu ra và tệp tiêu chuẩn

TRIỆU CHỨNG: tee [TÙY CHỌN] ... [TẬP TIN] ...

Theo đó:

echo test | tee file1 file2 file3

Stderr cũng có thể được chuyển hướng trong nhiều hơn một tập tin?
từ

Có, nó có thể được thực hiện nhờ khả năng chuyển hướng: find / -name test 2> & 1 | tee file1 file2 file3
akond

@akond, cmd 2>&1 | tee log1 log2 tôi đã thử thực hiện như trên, nhưng tôi cần nhấn ctrl-c để chuyển hướng nó đến tệp nhật ký thứ hai. đầu ra cũng được in trên bàn điều khiển. Tôi muốn đầu ra lệnh được chuyển hướng đến các bản ghi nhưng không phải trên bàn điều khiển. bất kỳ trợ giúp được đánh giá cao.
đôi

@doubledecker teeLệnh ghi stdinvào tập tin và cũng để stdout. Nếu bạn không muốn đầu ra xuất hiện trên thiết bị đầu cuối, bạn phải chuyển hướng để /dev/nullgiống như bạn thường làm.
Minix

4
Cũng có thể nối thêm nhiều tệp:echo test | tee --append file1 file2
user1364368 29/07/2016

13

Giả sử đầu ra của bạn được tạo từ một hàm , cmd():

cmd() {
    echo hello world!
}

Để chuyển hướng đầu ra từ cmdhai tệp, nhưng không chuyển đến bàn điều khiển, bạn có thể sử dụng:

cmd | tee file1 file2 >/dev/null

Điều này sẽ làm việc cho nhiều tệp, được cung cấp bất kỳ đường ống nguồn dữ liệu nào đến tee:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

Điều này cũng sẽ làm việc:

echo $(cmd) | tee file1 file2 >/dev/null

Nếu không có /dev/nullchuyển hướng, tee sẽ gửi đầu ra tới thiết bị xuất chuẩn ngoài các tệp được chỉ định.

Ví dụ: nếu điều này được chạy từ bảng điều khiển, bạn sẽ thấy đầu ra ở đó. Chạy từ một crontab, đầu ra sẽ xuất hiện thông báo trạng thái được gửi đến bạn (cũng xem câu trả lời của Gilles tại đây https://unix.stackexchange.com/a/100833/3998 ).

Điều này hoạt động với tôi trong bash trên Ubuntu 12.04 và đã được xác minh trong Ubuntu 14.04 bằng GNU bash 4.3.11 (1), vì vậy nó sẽ hoạt động trên mọi phiên bản bash GNU gần đây.


@doubledecker - có vẻ như nó thỏa mãn điều kiện của bạn, vì vậy có thể được chấp nhận làm câu trả lời. Ngoài ra, +1 khi tôi đã thử nghiệm điều này trong GNU bash ( version 4.3.11(1)-release (i686-pc-linux-gnu)) trong Ubuntu 14.04.
belacqua

9

Đó là một bài viết cũ nhưng tôi chỉ tìm thấy nó bây giờ ...

Thay vì chuyển hướng đầu ra đến > /dev/nullbạn có thể chuyển hướng nó đến tệp cuối cùng:

echo "foobarbaz" | tee file1 > file2

Hoặc để nối thêm đầu ra:

echo "foobarbaz" | tee -a file1 >> file2

đây ít nhiều là những gì câu trả lời khác đã nói (ngoại trừ -a trong tee)
Archemar

Đây là con đường để đi.
71GA

5

Như @jofel đã đề cập trong một bình luận dưới câu trả lời, điều này có thể được thực hiện nguyên bản trong zsh:

echo foobar >file1 >file2 >file3

hoặc, với mở rộng cú đúp:

echo foobar >file{1..3}

Trong nội bộ này hoạt động rất giống với các teecâu trả lời được cung cấp ở trên. Shell kết nối thiết bị xuất chuẩn của lệnh với một quá trình chuyển sang nhiều tệp; do đó, không có bất kỳ lợi thế kỹ thuật hấp dẫn để làm nó theo cách này (nhưng nó không trông thực sự tốt). Xem các zshnhãn hiệu để biết thêm.


2

Không thể bình luận, tuy nhiên, một cách khác để thể hiện

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

Có thể được đơn giản hóa để điều này, khi xử lý nhiều tập tin.

echo "foobarbaz" | tee file{1..8} > /dev/null

2
Làm thế nào là điều này thực sự khác biệt với các câu trả lời khác đã được đưa ra? Đặc biệt kể từ khi vài người có khả năng muốn literal file1qua file8như tên của họ và những người có nhiều khả năng chỉ là ví dụ giữ chỗ cho tên của các tập tin
Eric Renouf

1
Có khả năng hay không, đây chính xác là giải pháp tôi cần, và nghĩ rằng nó có thể giúp đỡ người khác.
dùng149146
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.