苦苦挣扎解析(bash)时间命令

Ste*_*hen 15 bash time

我正在努力解析bash中time命令的输出 - 甚至在我调用它时阻止它打印输出.这是我的测试代码:

#!/bin/bash
TIME=`time ls -lh > /dev/null`
echo "Testing..."
echo $TIME
Run Code Online (Sandbox Code Playgroud)

目前打印出:

{blank-line}
real    0m0.064s
user    0m0.002s
sys     0m0.005s
Testing
{blank-line}
Run Code Online (Sandbox Code Playgroud)

因此,分配的值似乎$TIME是打印输出开始时的空白行.我需要得到sys系列的秒值 - 即"0.005".我保证我只会有秒,所以我在"m"之前不需要任何东西 - 但是,如果秒> = 10秒,秒部分可能是xx.xxx的形式.我目前不知道如何抑制'时间'输出,捕获它而不是空白行,也不解析它以获得我需要的值.

任何帮助将非常感激...

Pau*_*ce. 18

如果使用Bash内置time,则可以通过设置TIMEFORMAT变量来控制其输出:

TIMEFORMAT=%R
Run Code Online (Sandbox Code Playgroud)

并且您不必进行任何解析,因为这将导致time仅输出秒数.

并使用这个:

echo "Testing..."
TIME=$( { time ls -lh > /dev/null; } 2>&1 )
echo $TIME
Run Code Online (Sandbox Code Playgroud)

或者来自BashFAQ/032的其他技术之一.


wup*_*tah 7

首先,您尝试捕获的数据正在写入标准错误.但在这种情况下捕获该输出相当棘手.

time/usr/bin在bash和其他shell中既是可执行的(in ),也是内置的shell命令.在time未指定的情况下执行时/usr/bin/time,您正在bash中执行内置命令.这使得输出很难做到,因为bash并不像普通程序那样对待它; 它是由bash编写的特殊内置函数.

知道了,并查看了手册页time(1),我可以看到你想要捕获的数据time被输出到stderr.所以我的解决方法是直接执行/usr/bin/time如下:

TIME=`/usr/bin/time ls -lh 2>&1 >/dev/null`
Run Code Online (Sandbox Code Playgroud)

这会将标准错误流复制到标准输出,然后重定向通常转到标准输出的内容/dev/null.但是,标准错误仍将标准化,因为它在重定向之前是重复的.颠倒这些顺序是行不通的.(是的,这很令人困惑.)

不幸的是,/usr/bin/time它的输出不太精确:

    0.00 real         0.00 user         0.00 sys
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用2个子shell,如下所示:

TIME=$((time ls -lh >/dev/null) 2>&1)
Run Code Online (Sandbox Code Playgroud)

这将重写第一个第二个子shell中写入标准错误的内容,允许您捕获输出.有关子shell的更多信息,请参见http://www.tldp.org/LDP/abs/html/subshel​​ls.html.