Я просто хочу захватить вывод команды времени, то есть:
X=$(time ls)
или
$(time ls) | grep real
Однако функция времени выводит его на консоль. Как мне это сделать?
X = `(время ls) 2> & 1 | 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"
которое будет «реальным» временем.
Time записывает свой вывод в 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.
К сожалению, Mac date
команда не поддерживает %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"
Самый чистый подход - объединить временный файл и пользуйтесь временем GNU.
command="sleep 1"
saved_timing=`mktemp`
/usr/bin/time --format="%E real" -o "$saved_timing" $command
elapsed=$(cat "$saved_timing")
echo $elapsed
Это не будет обходить обычный вывод команды, и вам также не нужно заботиться о файле, поскольку он будет удален сам по себе.