Два вопроса здесь.
Первое и самое важное, "время" отправляет свой вывод в stderr (стандартная ошибка), а не в stdout, так что он не будет захвачен обычными командами перенаправления, если вы не примете специальные меры.
Во-вторых, time - это не обычная программа, а специальная встроенная команда, интерпретируемая непосредственно оболочкой (для оболочек, таких как bash, csh, tcsh и т.д.). Таким образом, он работает нестандартным образом и время всей остальной части командной строки (если вы не используете очень необычную оболочку).
Итак, чтобы получить желаемый результат (используя bash), вам нужно использовать:
(time ls) 2>&1 | grep real
Это запустит "ls" в подоболочке и рассчитает время [ (time ls) ], отправит стандартную ошибку в standard out [2> & 1] , а затем отправит стандартную ошибку в "grep" [ | grep ].
Последняя часть, которую вы использовали ">?dev/null "выбрасывает нормальный вывод самой команды ls, в том случае, если в нее включено слово" real ".