How to wrap a command to measure its elapsed time?
Currently I do it using
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"
which leads to:
do job
do job done (elapsed time 00:01)
For my cases this approach _almost _ works. However, this approach is considered bad because it violates some rules from BashFAQ . For example, "don't put code inside variables" from [BashFAQ #50](https://mywiki.wooledge.org/BashFAQ/050) (see also [BashFAQ #48](https://mywiki.wooledge.org/BashFAQ/048)).
So, the question is: how to do it correctly?
Asked by pmor
(665 rep)
Nov 21, 2022, 09:22 AM
Last activity: Nov 23, 2022, 04:28 PM
Last activity: Nov 23, 2022, 04:28 PM