首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析(bash)时间命令时遇到困难

解析(bash)时间命令时遇到困难
EN

Stack Overflow用户
提问于 2010-10-14 06:06:26
回答 5查看 10K关注 0票数 18

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

代码语言:javascript
复制
#!/bin/bash
TIME=`time ls -lh > /dev/null`
echo "Testing..."
echo $TIME

当前打印的内容如下:

代码语言:javascript
复制
{blank-line}
real    0m0.064s
user    0m0.002s
sys     0m0.005s
Testing
{blank-line}

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

任何帮助都将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-14 09:25:07

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

代码语言:javascript
复制
TIMEFORMAT=%R

而且您不需要进行任何解析,因为这将导致time仅输出秒数。

并使用以下命令:

代码语言:javascript
复制
echo "Testing..."
TIME=$( { time ls -lh > /dev/null; } 2>&1 )
echo $TIME

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

票数 22
EN

Stack Overflow用户

发布于 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,如下所示:

代码语言:javascript
复制
TIME=`/usr/bin/time ls -lh 2>&1 >/dev/null`

这会将标准错误流复制到标准输出,然后将通常转到标准输出的错误流重定向到/dev/null。然而,标准错误仍然会转到标准输出,因为它在重定向之前是重复的。颠倒这些顺序将不起作用。(是的,这是令人困惑的。)

不幸的是,/usr/bin/time的输出没有那么精确:

代码语言:javascript
复制
    0.00 real         0.00 user         0.00 sys

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

代码语言:javascript
复制
TIME=$((time ls -lh >/dev/null) 2>&1)

这将重写在第一个子subshell中的第二个子subshell上写入标准错误的内容,从而允许您捕获输出。有关shells的更多信息,请参见http://www.tldp.org/LDP/abs/html/subshells.html

票数 8
EN

Stack Overflow用户

发布于 2014-05-28 20:33:24

虽然解决方案徘徊在相同的逻辑上,但我仍然找不到下面列出的解决方案,所以是另一个版本的解决方案:

代码语言:javascript
复制
TIME=$(time (ls -lh >/dev/null) 2>&1)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3928430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档