1

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

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

当我echo变量时,x1我得到0m17.430s了所需的输出,但是当我echo变量时t1,它什么也没打印!如何存储mvn test -Drat.skipin的控制台输出t1

4

2 回答 2

3

内部()或反引号中的所有内容都发生在子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")
于 2020-01-20T09:59:38.733 回答
1

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

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)
于 2020-01-20T12:20:44.103 回答