【问题标题】:How to store elapsed time of a variable assignment to another variable in bash script?如何将变量赋值的经过时间存储到bash脚本中的另一个变量?
【发布时间】:2020-01-20 09:48:48
【问题描述】:

我想运行一个 maven 命令并将控制台输出存储到一个变量中,然后将上述操作的 real 时间存储在另一个变量中。我写了以下命令-

x1=`( time t1=$( mvn test -Drat.skip)) 2>&1 | grep real`

当我echo 变量x1 我得到0m17.430s 这是所需的输出但是当我echo 变量t1 它什么也不打印!如何将mvn test -Drat.skip 的控制台输出存储在t1 中?

【问题讨论】:

  • 如果您想测量时间,我也会给mvn -q .. 以抑制控制台上的任何输出,因为您只对time 的输出感兴趣...
  • 其实我想捕获所有[INFO][DEBUG]的日志。
  • [DEBUG]  仅在您使用 mvn -X ... 时才会出现...此外,对于时间测量也无济于事...

标签: linux bash shell ubuntu


【解决方案1】:

() 或反引号内的所有内容都发生在子shell 中。变量值不会从子 shell 导出回父 shell。

您可以将命令的输出和time 的输出分配到一个变量中,然后从那里提取它:

#!/bin/bash
all=$((time mvn test -Drat.skip )2>&1)
time=$(tail -n3 <<< "$all" | grep real)
output=$(head -n-3 <<< "$all")

【讨论】:

    【解决方案2】:

    正如@choroba 所说,t1 是在不同的子外壳中创建的,无法导出回来。 你可以这样测试它:

    t1=test
    x1=`(time t1=$(echo ok); echo $t1) 2>&1`
    echo $t1
    echo $x1
    

    输出将是:

    $ echo $t1
    test
    
    $ echo $x1
    real 0m0,001s user 0m0,001s sys 0m0,001s ok
    

    但是这个小技巧可能会有所帮助

    fun () { t1=$(mvn test -Drat.skip); }
    x1=$((time fun) 2>&1 | grep real)
    

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2016-10-28
      相关资源
      最近更新 更多