Я просто хочу захватить вывод команды времени, т.е.
X=$(time ls)
или
$(time ls) | grep real
Хотя функция времени плюет на консоль. Как мне это сделать?
Я просто хочу захватить вывод команды времени, т.е.
X=$(time ls)
или
$(time ls) | grep real
Хотя функция времени плюет на консоль. Как мне это сделать?
Ответы:
Смотрите BashFAQ / 032 .
$ # captures output of command and time
$ time=$( TIMEFORMAT="%R"; { time ls; } 2>&1 ) # note the curly braces
$ # captures the time only, passes stdout through
$ exec 3>&1 4>&2
$ time=$(TIMEFORMAT="%R"; { time ls 1>&3 2>&4; } 2>&1)
bar baz
$ exec 3>&- 4>&-
Время будет выглядеть как «0,000», используя TIMEFORMAT="%R"
реальное время.
exec
командой в моем ответе с использованием доступных файловых дескрипторов. Можно использовать любые доступные файловые дескрипторы. Потоки 3 и 4 являются копиями 1 ( stdout
) и 2 ( stderr
) соответственно. Это позволяет ls
нормально передавать выходные данные в stdout
и stderr
через 3 и 4, в то время как выходные данные time
(которые обычно идут в stderr
) перенаправляются в исходное состояние stdout
(1) и затем записываются в переменную с помощью подстановки команд. Как вы можете видеть в моем примере, имена файлов bar
и baz
выводятся на терминал. ...
-
.
Время записывает свой вывод в STDERR, а не в STDOUT. Что еще хуже, по умолчанию 'time' является встроенной командой оболочки, поэтому, если вы попытаетесь 'time ls 2> & 1', '2> & 1' будет применяться только к 'ls'.
Решение, вероятно, будет что-то вроде:
/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')
Есть более причудливые способы сделать это, но это ясный / простой способ.
Ответ @Dennis Williamson отличный, но он не поможет вам сохранить выходные данные команды в одной переменной, а выходные данные - time
в другой переменной. На самом деле это невозможно при использовании файловых дескрипторов.
Если вы хотите записать, сколько времени занимает запуск программы, вы можете сделать это, просто вычтя время начала из времени окончания. Вот простой пример, который показывает, сколько миллисекунд потребовалось программе для запуска:
START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
Это не так точно, как time
команда, но она должна прекрасно работать для большинства скриптов bash.
К сожалению, date
команда Mac не поддерживает %N
формат, но вы можете установить coreutils
( brew install coreutils
) и использовать gdate
:
START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
time
; Ответ Денниса Уильямсона лучше в этом отношении.