Có cách nào để chuyển hướng đầu ra của chương trình mà vẫn chuyển đến thiết bị xuất chuẩn không?


24

Đuợc. Nếu tôi muốn chuyển hướng đầu ra của một chương trình sang một tệp, tôi sẽ làm một cái gì đó như thế này

prog > file

Nếu tôi muốn chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn vào tệp đó, thì tôi sẽ làm

prog > file 2>&1

Đây là tất cả tốt và tốt nếu bạn muốn đầu ra đi đến tập tin. Nhưng nếu bạn muốn đầu ra đi vào tập tin mà vẫn vào stdout / stderr thì sao? Vì vậy, đầu ra được lưu trong tệp, nhưng bạn vẫn có thể thấy nó trên bàn điều khiển khi chương trình đang chạy. Có cách nào làm được việc này không? Và nếu vậy thì thế nào?


Thuật ngữ: Bạn có nghĩa là và vẫn đi đến thiết bị đầu cuối . stdoutlà mô tả tệp 1 và foo > some_filecó nghĩa là một mô tả tệp chỉ ghi được mở trên some_filelà thiết bị xuất chuẩn của foo. thiết bị xuất chuẩn luôn đi đến thiết bị xuất chuẩn.
Peter Cordes

Câu trả lời:


39

teetồn tại cho mục đích này; nó nhận một đối số tên tệp và ghi dữ liệu mà nó đọc từ stdin vào cả stdout và tệp:

$ prog 2>&1 | tee file

10
Và để thêm bash 4 dễ thương : prog |& tee file.
Tobu

1
Bạn cũng có thể thay thế 'tập tin' bằng một đường ống có tên ...
Kevin Cantu

@KevinCantu: Một ống có tên chỉ là một loại tệp; Đây là Unix nơi mọi thứ là một tập tin. Bạn cũng có thể prog |& tee /dev/tty > file, có thể hữu ích ở giữa một đường ống, ví dụ foo |& tee /dev/tty | sed 's/.*\r//' > foo.logđể xem các cập nhật tiến trình dòng trạng thái trên thiết bị đầu cuối của bạn, nhưng lọc chúng ra khỏi tệp nhật ký. Hoặc sử dụng nó để gỡ lỗi một đường ống mà bạn đang hack cùng nhau bằng cách cho phép bạn xem dữ liệu tại thời điểm đó.
Peter Cordes
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.