我很难在bash中解析time命令的输出-甚至在我调用它时阻止它打印输出。这是我的测试代码:
#!/bin/bash
TIME=`time ls -lh > /dev/null`
echo "Testing..."
echo $TIME当前打印的内容如下:
{blank-line}
real 0m0.064s
user 0m0.002s
sys 0m0.005s
Testing
{blank-line}因此,分配给$TIME的值似乎是时间打印输出开始时的空行。我需要得到sys行的秒值--即"0.005“。我保证我永远只有秒,所以我不需要"m“之前的任何东西-然而,如果秒部分发生>= 10秒,它可能是xx.xxx的形式。我现在不知道如何抑制'time‘输出,捕获它而不是空白行,也不知道如何解析它来获得我需要的值。
任何帮助都将不胜感激。
发布于 2010-10-14 09:25:07
如果使用time中内置的Bash,则可以通过设置TIMEFORMAT变量来控制其输出:
TIMEFORMAT=%R而且您不需要进行任何解析,因为这将导致time仅输出秒数。
并使用以下命令:
echo "Testing..."
TIME=$( { time ls -lh > /dev/null; } 2>&1 )
echo $TIME或者来自BashFAQ/032的其他技术之一。
发布于 2010-10-14 06:18:10
首先也是最重要的是,您试图捕获的数据将被写入标准错误。但在这种情况下,捕获该输出是相当棘手的。
time既是一个可执行文件(在/usr/bin中),也是bash和其他shell中的内置shell命令。当您在没有指定/usr/bin/time的情况下执行bash时,您是在执行bash中的内置命令。这使得处理输出变得很困难,因为bash不像对待普通程序那样对待它;它是由bash编写的一个特殊的内置函数。
了解了这一点,并查看time(1)的手册页,我可以看到您试图从time捕获的数据被输出到stderr。因此,我的解决方法是直接执行/usr/bin/time,如下所示:
TIME=`/usr/bin/time ls -lh 2>&1 >/dev/null`这会将标准错误流复制到标准输出,然后将通常转到标准输出的错误流重定向到/dev/null。然而,标准错误仍然会转到标准输出,因为它在重定向之前是重复的。颠倒这些顺序将不起作用。(是的,这是令人困惑的。)
不幸的是,/usr/bin/time的输出没有那么精确:
0.00 real 0.00 user 0.00 sys或者,您可以使用2个子shell,如下所示:
TIME=$((time ls -lh >/dev/null) 2>&1)这将重写在第一个子subshell中的第二个子subshell上写入标准错误的内容,从而允许您捕获输出。有关shells的更多信息,请参见http://www.tldp.org/LDP/abs/html/subshells.html。
发布于 2014-05-28 20:33:24
虽然解决方案徘徊在相同的逻辑上,但我仍然找不到下面列出的解决方案,所以是另一个版本的解决方案:
TIME=$(time (ls -lh >/dev/null) 2>&1)https://stackoverflow.com/questions/3928430
复制相似问题