Я хочу до time
команди, яка складається з двох окремих команд з одним висновком трубопроводу до іншого. Наприклад, розглянемо два сценарії нижче:
$ cat foo.sh
#!/bin/sh
sleep 4
$ cat bar.sh
#!/bin/sh
sleep 2
Тепер, як я можу змусити time
повідомити про витрачений час foo.sh | bar.sh
(і так, я знаю, що тут немає сенсу, але це лише приклад)? Це працює так, як очікувалося, якщо я запускаю їх послідовно в підпакеті без трубопроводів:
$ time ( foo.sh; bar.sh )
real 0m6.020s
user 0m0.010s
sys 0m0.003s
Але я не можу змусити його працювати при трубопроводі:
$ 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
Я читав подібне запитання ( Як запустити час на декілька команд ТА записати час на виведення у файл? ), А також спробував автономний time
виконуваний файл:
$ /usr/bin/time -p sh -c "foo.sh | bar.sh"
real 4.01
user 0.00
sys 0.00
Він навіть не працює, якщо я створити третій сценарій, який запускає лише трубу:
$ cat baz.sh
#!/bin/sh
foo.sh | bar.sh
А потім час, що:
$ time baz.sh
real 0m4.009s
user 0m0.003s
sys 0m0.000s
Цікаво, що він не видається, time
як тільки виходить перша команда. Якщо я перейду bar.sh
на:
#!/bin/sh
sleep 2
seq 1 5
І time
знову, я очікував, що time
вихід буде надрукований раніше, seq
але це не так:
$ time ( { foo.sh | bar.sh; } )
1
2
3
4
5
real 0m4.005s
user 0m0.003s
sys 0m0.000s
Схоже time
, не рахується часу, необхідного для його виконання, bar.sh
незважаючи на очікування закінчення до друку звіту 1 .
Всі тести проводили за системою Arch з використанням bash 4.4.12 (1) -випуск. Я можу використовувати лише bash для проекту, це частина, тому навіть якщо zsh
або якась інша потужна оболонка може обійти її, це не буде життєздатним рішенням для мене.
Отже, як я можу отримати час для запуску набору команд з трубопроводами? І хоча ми це робимо, чому це не працює? Схоже, що time
миттєво завершуємо роботу, як тільки перша команда закінчена. Чому?
Я знаю, що я можу отримати окремий час приблизно таким чином:
( time foo.sh ) 2>foo.time | ( time bar.sh ) 2> bar.time
Але я все-таки хотів би знати, чи можна присвоїти цю справу як одну операцію.
1 Це, здається, не є проблемою з буфером, я спробував запустити сценарії з, unbuffered
і stdbuf -i0 -o0 -e0
цифри все ще надрукувались до time
виводу.