Làm thế nào tôi có thể chuyển hướng đầu ra `time` và đầu ra lệnh vào cùng một đường ống?


24

Giả sử tôi có một nhị phân được gọi foo.

Nếu tôi muốn chuyển hướng đầu ra của foomột số quy trình khác bar, tôi có thể viết ./foo | bar.

Mặt khác, nếu tôi muốn timefoo và chuyển hướng đầu ra của timetôi có thể viết , time (./foo) | bar.

Câu hỏi của tôi là, làm thế nào tôi có thể dán đầu ra của timeđến cuối đầu ra foovà đưa nó qua cùng một đường ống ?

Giải pháp sau đây không phải là điều tôi đang tìm kiếm, bởi vì nó bắt đầu hai trường hợp riêng biệt của quy trình bar, trong khi tôi muốn một đường ống chung, đến một trường hợp duy nhất bar.

time (./foo | bar)  | bar

Đối với bất kỳ ai tò mò, lý do không muốn bắt đầu hai trường hợp barlà vì barcó thể là máy khách mạng và tôi muốn thông tin về thời gian được gửi đến máy chủ như một phần của cùng một http POSTthông báo như đầu ra của quá trình.


đã trả lời ở đây, phần nào trả lời tốt hơn: stackoverflow.com/questions/13356628/ từ
JDS

Câu trả lời:


29

Nếu tôi hiểu những gì bạn yêu cầu tôi sẽ làm điều này. Tôi đang sử dụng các lệnh ls ~teenhư stand-in cho ./foobar, nhưng dưới hình thức chung của những gì bạn muốn điều này là:

$ ( time ./foo ) |& bar

LƯU Ý: Đầu ra của timeđã được gắn vào cuối bất kỳ đầu ra nào ./foo, nó chỉ được thực hiện trên STDERR. Để chuyển hướng nó qua đường ống, bạn cần kết hợp STDERR với STDOUT. Bạn có thể sử dụng |&hoặc 2>&1để làm như vậy.

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

Thí dụ

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

Và đây là nội dung của tập tin cmd.logđược sản xuất bởi tee.

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

Lưu ý rằng cú pháp này không hoạt động cho BASH.
jvriesem

1
@jvriesem tất cả các ví dụ là từ bash
slm

9

timegửi đầu ra của nó tới stderr thay vì stdout theo mặc định. Bạn chỉ cần chuyển hướng mà bạn muốn nó.

Bạn nói "Mặt khác, nếu tôi muốn timefoo và chuyển hướng đầu ra của timetôi có thể viết time (./foo) | bar." nhưng điều này thực sự không chính xác. Trong trường hợp này, đầu ra của thời gian vẫn sẽ được hiển thị trên bảng điều khiển của bạn, chỉ có thiết bị xuất chuẩn sẽ được chuyển hướng.

Bạn có thể chuyển hướng stderr cụ thể với:

(time foo) 2>&1 | bar

hoặc tất cả các ống có:

(time foo) |& bar

Các dấu ngoặc là cần thiết để làm việc này chính xác.


0

Tôi thấy rằng điều này hoạt động trên Solaris. (time ls) &> file


1
Điều này không khác với một trong những giải pháp hiện có
roaima
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.