我有以下程序,我想打印一个$var
用程序的执行时间填充的变量。但是,当将其输出到控制台时,echo
或printf
该值为空。
程序:
#!/bin/bash
for n in 1 2 3 4;
do my_time="$(time var=$(echo "scale=100; 4*a(1)" | bc -l))";
echo $var
echo $my_time
printf "Value of PI is :%s\n" $var
done
输出:
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Value of PI is :
real 0m0.004s
user 0m0.000s
sys 0m0.000s
Value of PI is :
real 0m0.004s
user 0m0.000s
sys 0m0.000s
Value of PI is :
real 0m0.004s
user 0m0.000s
sys 0m0.000s
Value of PI is :
问题出在哪里,如何解决?
答案1
命令替换$(...)
在子 shell 中运行命令。在子 shell 中设置变量不会传播到父 shell。
在这种情况下,问题就更大了,因为time
内置函数不会输出到标准输出或错误。为了能够捕获其输出,您需要在子 shell 中运行它并捕获该 shell 的 stderr - 但这样,您就无法设置任何变量。
我看到的唯一可能的方法是运行命令两次,一次捕获输出,一次捕获时间:
var=$(bc -l <<< 'scale=100; 4*a(1)')
my_time=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1 >/dev/null)
或者,同时捕获这两个细节并稍后将它们分开:
out=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1)
var=${out%real*}
my_time=real${out#*real}