Прежде всего, данные, которые вы пытаетесь захватить, записываются со стандартной ошибкой. Но захват этого вывода довольно сложен в этом случае.
time
является одновременно исполняемым (в /usr/bin
), а также встроенной командой оболочки в bash и других оболочках. Когда вы выполняете time
без указания /usr/bin/time
, вы выполняете встроенную команду в bash. Это затрудняет работу с выводом, поскольку bash не рассматривает его как обычную программу; это специальная встроенная функция, написанная bash.
Зная это, и глядя на справочную страницу для time(1)
, я вижу, что данные, которые вы пытаетесь захватить с time
, выводятся в stderr. Так что мой обходной путь для этого заключается в прямом выполнении /usr/bin/time
следующим образом:
TIME=`/usr/bin/time ls -lh 2>&1 >/dev/null`
Копирует стандартный поток ошибок в стандартный вывод, а затем перенаправляет то, что обычно идет в стандартный вывод, в /dev/null
. Стандартная ошибка, тем не менее, все равно будет преобразована в стандартную, поскольку она была продублирована до перенаправления. Обратный порядок этих не будет работать. (Да, это сбивает с толку.)
К сожалению, /usr/bin/time
немного менее точен в выводе:
0.00 real 0.00 user 0.00 sys
<ч />
В качестве альтернативы, вы можете использовать 2 подоболочки следующим образом:
TIME=$((time ls -lh >/dev/null) 2>&1)
Это переписало бы то, что записано в стандартную ошибку на втором подоболочке внутри первого, что позволит вам захватить вывод. См. http://www.tldp.org/LDP/abs/html/subshells.html для получения дополнительной информации о подоболочках.