将 unix 中的时间命令输出重定向到 bash 中的变量?

将 unix 中的时间命令输出重定向到 bash 中的变量?

我只是想捕获时间命令的输出,即:

X=$(time ls)

或者

$(time ls) | grep real

时间函数会将其吐出到控制台。我该怎么做呢?

答案1

X=`(time ls) 2>&1 | grep real`

答案2

Bash常见问题/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"这将是“真实”时间。

答案3

Time 将其输出写入 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 ' ')

有更多奇特的方法可以做到这一点,但这是清晰/简单的方法。

答案4

@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格式,但你可以安装coreutilsbrew 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"

相关内容