Obtém a saída do comando time

3

Eu tenho o seguinte comando

time compare -metric rmse -subimage-search -dissimilarity-threshold 1 -similarity-threshold 0.99 $page \( -size 1x1 xc:black \) null:

que produz os seguintes resultados:

0 (0) @ 7,0
real    0m28.366s
user    0m25.400s
sys     0m1.500s

Eu estou olhando para armazenar os resultados do comando em uma matriz, como tal

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[*]}"

no entanto, array está vazio. Por quê?

    
por user68650 08.11.2014 / 17:54

1 resposta

2

O comando time imprimirá sua saída para erro padrão, não para saída padrão. Então é isso que você precisa capturar. Então, você precisa capturar a saída de time e não a saída do comando que você está sincronizando. Normalmente, isso é feito agrupando ou executando os comandos em um subshell (em { } ou ( ) respecitvely), redirecionando a saída do grupo para /dev/null e redirecionando seu erro para a saída padrão. Por exemplo:

$ declare -a array=( $( { time ls; } 2>&1 >/dev/null ))
$ echo ${array[*]} 
real 0m0.003s user 0m0.000s sys 0m0.000s

Para salvar cada linha como um elemento de matriz, use o mapfile builtin. No entanto, a matriz criada só estará disponível no agrupamento:

$ { 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

Não tenho certeza se você deseja a saída do comando na matriz ou apenas a saída de time . Se você quiser o comando também, remova o > /dev/null de cada um dos exemplos acima.

    
por 08.11.2014 / 18:22