Câu trả lời:
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
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.
tee
Lệnh ghi stdin
và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/null
giống như bạn thường làm.
echo test | tee --append file1 file2
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ừ cmd
hai 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/null
chuyể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.
version 4.3.11(1)-release (i686-pc-linux-gnu)
) trong Ubuntu 14.04.
Đó 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/null
bạ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
-a
trong tee)
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 tee
câ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 zsh
nhãn hiệu để biết thêm.
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
file1
qua file8
như 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
zsh
, bạn có thể sử dụngsome_command >output_log_1 >output_log_2
.