我有以下命令
time compare -metric rmse -subimage-search -dissimilarity-threshold 1 -similarity-threshold 0.99 $page \( -size 1x1 xc:black \) null:
产生以下结果:
0 (0) @ 7,0
real 0m28.366s
user 0m25.400s
sys 0m1.500s
我希望将命令的结果存储在数组中,这样
declare -a Pageinfo=($(time compare -metric rmse -subimage-search -dissimilarity-threshold 1 -similarity-threshold 0.99 out1.tif \( -size 1x1 xc:black \) null: ))
echo "Pageinfo results = ${Pageinfo[*]}"
但是,数组是空的。为什么?
答案1
该time
命令会将其输出打印到标准错误,而不是标准输出。这就是您需要捕获的内容。然后,您需要捕获正在计时的命令的输出time
,而不是该命令的输出。通常,这是通过在子 shell 中(分别在{ }
或分别)中分组或运行命令( )
、将组的输出重定向到标准输出/dev/null
并将其错误重定向到标准输出来完成的。例如:
$ declare -a array=( $( { time ls; } 2>&1 >/dev/null ))
$ echo ${array[*]}
real 0m0.003s user 0m0.000s sys 0m0.000s
为了保存每个线作为数组元素,使用mapfile
内置的。但是,创建的数组仅在分组内可用:
$ { time ls; } 2>&1 >/dev/null | {
mapfile array1;
echo "1: ${array1[1]}2:${array1[2]}3:${array1[3]}";
}
1: real 0m0.003s
2:user 0m0.000s
3:sys 0m0.000s
我不确定您是否想要数组中命令的输出或仅time
.如果您也需要该命令,请> /dev/null
从上面的每个示例中删除 。