Como agrupar um comando para medir seu tempo decorrido?
Atualmente eu faço isso usando eval
:
do_cmd_named()
{
local name=$1
local cmd=$2
echo "$name"
local start_time=$(date +%s)
eval "$cmd 2>&1"
local exit_status=$?
local end_time=$(date +%s)
local elapsed_time_sec=$((end_time-start_time))
local elapsed_time_min_sec=$(date -ud "@$elapsed_time_sec" +'%M:%S')
if [[ $exit_status -ne 0 ]]
then
echo "$name failed with exit status $exit_status (elapsed time $elapsed_time_min_sec)"
return $exit_status
else
echo "$name done (elapsed time $elapsed_time_min_sec)"
fi
}
job()
{
sleep 1
}
do_cmd_named "do job" "job"
o que leva a:
do job
do job done (elapsed time 00:01)
Para meus casos, essa abordagem quase funciona. No entanto, essa abordagem é considerada ruim porque viola algumas regras do BashFAQ . Por exemplo, "não coloque código dentro de variáveis" de BashFAQ #50 (consulte também BashFAQ #48 ).
Então, a pergunta é: como fazer isso corretamente?
eval
$SECONDS
Sim, é verdade.
Uma abordagem alternativa é no início da função, capturar o valor atual de SECONDS e fazer alguma aritmética no final.
Um exemplo:
e executá-lo, toda a saída aparece após uma duração de 15 segundos:
Se mudar para zsh for uma opção: