Tôi muốn timemộ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ó timethể 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ử timethự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ể timethoát ra ngay sau khi lệnh đầu tiên được thực hiện. Nếu tôi đổi bar.shthà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 seqnhư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ư timekhông tính thời gian thực hiện bar.shmặ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 zshhoặ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ư timengay 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 unbufferedvà stdbuf -i0 -o0 -e0và những con số vẫn còn in trước khi timeđầu ra.