Làm cách nào để chuyển hướng đầu ra của lệnh “time”?


95

Tôi đã cố gắng chuyển hướng đầu ra của lệnh thời gian, nhưng tôi không thể:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

Trong tệp, tôi có thể thấy đầu ra của lslệnh, không phải của time. Vui lòng giải thích, tại sao tôi không thể và làm thế nào để làm điều này.


1
Tôi nghĩ nên sử dụng Superuser.
Mnementh

1
Câu trả lời cho câu hỏi này không chỉ hấp dẫn cho các lập trình viên, mà còn cho sức mạnh người tiêu dùng khác: superuser.com
Mnementh

Câu trả lời:


104

bạn có thể chuyển hướng đầu ra thời gian bằng cách sử dụng,

(time ls) &> file

Vì bạn cần lấy (time ls) như một lệnh duy nhất để bạn có thể sử dụng dấu ngoặc nhọn.


1
vâng, tương đối ổn, nhưng câu hỏi là họ đã làm điều này như thế nào?
abubacker

2
lệnh time sẽ lấy các đối số làm lệnh. Nhưng dấu ngoặc đơn sẽ nhóm nó thành một lệnh. Ví dụ: time ls> file1.txt Trong đối số, 0 = time 1 = "ls> file1.txt"
sganesh

8
Và lệnh thời gian in đầu ra trong stderr. Vì vậy, bạn có thể sử dụng (ls thời gian) 2> tập tin
sganesh

5
Làm rõ về &>vui lòng, tôi có thể tìm hiểu về những điều này ở đâu?
hello_there_andy

3
@hello_there_andy &>filetương tự như >file 2>&1. Nó chỉ đạo cả stdout và stderr.
ktbiz

129

không cần phải khởi chạy trình bao phụ. Sử dụng một khối mã cũng sẽ làm được.

{ time ls; } 2> out.txt

hoặc là

{ time ls > /dev/null 2>&1 ; } 2> out.txt

1
Đồng ý, câu trả lời hay nhất. Cung cấp cho bạn tùy chọn để loại bỏ kết quả ls và chỉ cần có thời gian. Cảm ơn bạn ghostdog74
rd42

1
Điều này hoạt động với AIX khi không có gì có thể chuyển hướng đầu ra của lệnh "hostent". Cảm ơn bạn!
Hugo

1
Làm rõ về 2>xin vui lòng. Tôi có thể tìm hiểu về những điều này ở đâu?
hello_there_andy

3
làm thế nào để làm điều đó nếu tôi muốn cả hai> và 2> cùng một lúc?
Jorge Fernández

25

Thời gian lệnh gửi đầu ra của nó tới STDERR (thay vì STDOUT). Đó là bởi vì lệnh được thực thi với thời gian bình thường (trong trường hợp này là ls) xuất ra STDOUT.

Nếu bạn muốn nắm bắt đầu ra của thời gian, hãy nhập:

(time ls) 2> filename

Điều đó chỉ nắm bắt đầu ra của thời gian, nhưng đầu ra của ls sẽ bình thường đối với bảng điều khiển. Nếu bạn muốn chụp cả hai trong một tệp, hãy nhập:

(time ls) &> filename

2> chuyển hướng STDERR &> chuyển hướng cả hai.


1
Câu trả lời này thực sự giải đáp lý do tại sao chuyển hướng của OP không hoạt động, đó là một trong những câu hỏi OP đang đặt ra. Không ai khác giải quyết vấn đề này.
NeutronStar

làm thế nào để một đường ống đến một quy trình khác với điều này?
Paul

10

thời gian là nội trang của trình bao và tôi không chắc liệu có cách nào để chuyển hướng nó hay không. Tuy nhiên, bạn có thể sử dụng /usr/bin/timethay thế, điều này chắc chắn chấp nhận mọi chuyển hướng đầu ra.


/ usr / bin / lần --output ls filename
chub

4
Thời gian nội trang hoạt động tốt với chuyển hướng đầu ra. Nó chỉ xuất ra trên STDERR, không phải trên STDOUT.
Mnementh

Vấn đề là các lệnh nội trang được thực thi trong chính môi trường shell, không phải là một subshell. Vì stderr của shell của bạn thường được kết nối với thiết bị đầu cuối, nên việc chuyển hướng sẽ không làm được gì cả. Để chuyển hướng thời gian tích hợp, tôi tin rằng bạn phải làm điều gì đó tương tự bash time mycmd 2>file. Hoặc chỉ cần gọi /usr/bin/timenhư đã được đề cập.
ktbiz

Bạn cũng có thể sử dụng phần mềm không tích hợp sẵn mà không cần chỉ định đường dẫn đầy đủ: stackoverflow.com/questions/29540540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4

Nếu bạn không muốn kết hợp đầu ra từ timevà lệnh. Với thời gian GNU, bạn có thể sử dụng -o filenhư:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

while timlà đầu ra của thời gian, outerrlà stdout và stderr từ grep.


4

Lý do tại sao chuyển hướng dường như không hoạt động timelà đó là một từ dành riêng cho bash (không phải nội trang!) Khi được sử dụng trước một đường ống. bash (1):

Nếu từ dành riêng thời gian đứng trước một đường ống, thì thời gian đã trôi qua cũng như người dùng và hệ thống đã sử dụng để thực thi nó được báo cáo khi đường ống kết thúc.

Vì vậy, để chuyển hướng đầu ra của time, hãy sử dụng dấu ngoặc nhọn:

{ time ls; } 2> filename

Hoặc gọi /usr/bin/time:

/usr/bin/time ls 2> filename

0

Tôi sử dụng phương pháp chuyển hướng của stdout và stderr có niềng răng để thử nghiệm.
Biểu &>>rptthị này >>rpt 2>&1nhưng ngắn hơn.
Các dấu ngoặc nhọn sẽ thực hiện (các) lệnh trong trình bao hiện tại. Xem: man bash

{ time ls a*; } &>>rpt
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.