Atribua o resultado da medição de um loop for com / usr / bin / time em uma variável

2

Eu preciso executar um comando curl dentro de um loop for várias vezes e obter o tempo médio necessário para executar um único curl. Isso é o que eu tenho:

while read query; do
  TIMEFORMAT=%R; time for i in {1..3}; do curl -s -w '\n' -XPOST -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode query='${query}' ${nginx_url} > /dev/null; done
done < queries.txt

Isso imprime o número de segundos no stdout, mas eu preciso atribuir esse número a uma variável para dividi-lo por 3 para obter a média.

Eu testei com:

realtime=$(time -f "%E" for i in {1..3} ..etc..)
realtime='time -f "%E" for i in {1..3} ..etc..'

Mas isso dá erro de sintaxe ./test-suite.sh: line 23: syntax error near unexpected token do '.

Eu também testei com:

realtime=$(bash -c "TIMEFORMAT=%R; time for i in {1..3} ..etc..")
realtime=$(bash -c "time -f "%E" for i in {1..3} ..etc..")
realtime=$(bash -c "TIMEFORMAT=%R; time for i in {1..3} do ..etc.. ; done; echo $realtime")

Todos eles não têm resultados. Qualquer idéia é bem vinda.

    
por Urco 07.08.2017 / 13:39

2 respostas

0

Eu entendi, eu tenho que colocar o comando entre parênteses,

mytime=$(time (for i in {1..3}; do curl -s -w '\n' -XPOST -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode query='select distinct ?Concept where {[] a ?Concept} LIMIT 100' http://143.233.226.61:443/sparql > /dev/null; done) 2>&1 1>/dev/null)
    
por 07.08.2017 / 13:47
1

Minha sugestão seria (ligeiramente modificada, já que não tenho sua configuração de curl / HTTP):

$ t=$(TIMEFORMAT=%R bash -c 'time for i in {1..3}; do sleep $((RANDOM % 5)); done' 2>&1)
$ avg=$(bc <<< "scale=3; $t/3")
$ echo $avg # YMMV
2.667

Como time é um bash integrado, precisamos colocar o redirecionamento stderr "fora" da chamada de horário; é por isso que envolvi a parte principal com bash -c ... .

Você não precisa definir TIMEFORMAT toda vez através do loop; basta colocá-lo no ambiente para a chamada para bash / time.

Observe que a aritmética de shell é baseada em números inteiros, portanto, para valores de ponto flutuante, use algo como bc . Minha time de saída tinha 3 casas decimais, e é isso que eu também perguntei ao bc .

    
por 07.08.2017 / 16:47