我想运行一个 Maven 命令并将控制台输出存储到一个变量中,然后real将提到的操作的时间存储在另一个变量中。我写了以下命令 -
x1=`( time t1=$( mvn test -Drat.skip)) 2>&1 | grep real`
当我echo变量时,x1我得到0m17.430s了所需的输出,但是当我echo变量时t1,它什么也没打印!如何存储mvn test -Drat.skipin的控制台输出t1?
内部()或反引号中的所有内容都发生在子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")
正如@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)