我正在努力解析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的其他技术之一.
首先,您尝试捕获的数据正在写入标准错误.但在这种情况下捕获该输出相当棘手.
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/subshells.html.
| 归档时间: |
|
| 查看次数: |
8735 次 |
| 最近记录: |