Answers:
$ # 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
正常传递给3和4 ,stdout
并stderr
通过3和4,而的输出time
(通常传递给stderr
)被重定向到原始stdout
(1),然后使用命令替换捕获到变量中。如您在我的示例中所见,文件名bar
和baz
被输出到终端。...
-
。
时间将其输出写入STDERR而不是STDOUT。更糟糕的是,默认情况下,“ time”是shell内置命令,因此,如果您尝试“ 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"
time
:在这方面,丹尼斯·威廉姆森的答案更好。