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

Jos*_*eld 13 linux bash

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

X=$(time ls)

或者

$(time ls) | grep real

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

Jas*_*erg 12

X=`(时间 ls) 2>&1 | grep真实`


Den*_*son 11

参见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>&-
Run Code Online (Sandbox Code Playgroud)

时间看起来像“0.000”,使用TIMEFORMAT="%R"这将是“真实”时间。

  • @Sirex:流 3 和 4 是我的答案中的“exec”命令使用可用文件描述符创建的流。可以使用任何可用的文件描述符。流 3 和 4 分别是 1 (`stdout`) 和 2 (`stderr`) 的副本。这允许“ls”的输出通过 3 和 4 正常传递到“stdout”和“stderr”,而“time”的输出(通常转到“stderr”)被重定向到原始的“stdout”(1)然后使用命令替换将其捕获到变量中。正如您在我的示例中看到的,文件名“bar”和“baz”被输出到终端。... (2认同)

小智 5

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 ' ')
Run Code Online (Sandbox Code Playgroud)

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