Tôi muốn time
một lệnh bao gồm hai lệnh riêng biệt với một đầu ra đường ống khác. Ví dụ, hãy xem xét hai tập lệnh dưới đây:
$ cat foo.sh
#!/bin/sh
sleep 4
$ cat bar.sh
#!/bin/sh
sleep 2
Bây giờ, làm thế nào tôi có time
thể báo cáo thời gian thực hiện foo.sh | bar.sh
(và vâng, tôi biết đường ống không có ý nghĩa gì ở đây, nhưng đây chỉ là một ví dụ)? Nó hoạt động như mong đợi nếu tôi chạy chúng tuần tự trong một lớp con mà không cần đường ống:
$ time ( foo.sh; bar.sh )
real 0m6.020s
user 0m0.010s
sys 0m0.003s
Nhưng tôi không thể làm cho nó hoạt động khi đường ống:
$ time ( foo.sh | bar.sh )
real 0m4.009s
user 0m0.007s
sys 0m0.003s
$ time ( { foo.sh | bar.sh; } )
real 0m4.008s
user 0m0.007s
sys 0m0.000s
$ time sh -c "foo.sh | bar.sh "
real 0m4.006s
user 0m0.000s
sys 0m0.000s
Tôi đã đọc qua một câu hỏi tương tự ( Cách chạy thời gian trên nhiều lệnh VÀ ghi đầu ra thời gian vào tệp? ) Và cũng đã thử time
thực thi độc lập :
$ /usr/bin/time -p sh -c "foo.sh | bar.sh"
real 4.01
user 0.00
sys 0.00
Nó thậm chí không hoạt động nếu tôi tạo tập lệnh thứ ba chỉ chạy đường ống:
$ cat baz.sh
#!/bin/sh
foo.sh | bar.sh
Và rồi thời gian đó:
$ time baz.sh
real 0m4.009s
user 0m0.003s
sys 0m0.000s
Thật thú vị, nó không xuất hiện như thể time
thoát ra ngay sau khi lệnh đầu tiên được thực hiện. Nếu tôi đổi bar.sh
thành:
#!/bin/sh
sleep 2
seq 1 5
Và sau đó time
, một lần nữa, tôi đã mong đợi time
đầu ra sẽ được in trước seq
nhưng nó không phải là:
$ time ( { foo.sh | bar.sh; } )
1
2
3
4
5
real 0m4.005s
user 0m0.003s
sys 0m0.000s
Có vẻ như time
không tính thời gian thực hiện bar.sh
mặc dù phải đợi nó hoàn thành trước khi in báo cáo 1 .
Tất cả các thử nghiệm đã được chạy trên hệ thống Arch và sử dụng bash 4.4.12 (1). Tôi chỉ có thể sử dụng bash cho dự án, đây là một phần vì vậy ngay cả khi zsh
hoặc một số vỏ mạnh mẽ khác có thể đi xung quanh nó, đó sẽ không phải là một giải pháp khả thi đối với tôi.
Vì vậy, làm thế nào tôi có thể có được thời gian một tập hợp các lệnh được thực hiện để chạy? Và, trong khi chúng ta đang ở đó, tại sao nó không hoạt động? Có vẻ như time
ngay lập tức thoát ra ngay sau khi lệnh đầu tiên kết thúc. Tại sao?
Tôi biết tôi có thể có được thời gian cá nhân với một cái gì đó như thế này:
( time foo.sh ) 2>foo.time | ( time bar.sh ) 2> bar.time
Nhưng tôi vẫn muốn biết liệu có thể tính thời gian cho toàn bộ hoạt động như một hoạt động không.
1 này dường như không phải là một vấn đề đệm, tôi đã cố gắng chạy các script với unbuffered
và stdbuf -i0 -o0 -e0
và những con số vẫn còn in trước khi time
đầu ra.