Sample Header Ad - 728x90

Bash: how to wrap a command to measure its elapsed time?

0 votes
2 answers
438 views
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