如何包装命令以测量其经过的时间?
目前我使用它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"
这导致:
do job
do job done (elapsed time 00:01)
对于我的情况,这种方法几乎有效。但是,这种方法被认为是不好的,因为它违反了BashFAQ的一些规则。例如, BashFAQ #50中的“不要将代码放在变量中” (另请参见BashFAQ #48)。
所以,问题是:如何正确地做到这一点?
eval
$SECONDS
是的,这是真的。
另一种方法是在函数开始时捕获 SECONDS 的当前值并在结束时进行一些算术运算。
一个例子:
并运行它,所有输出会在 15 秒后出现:
如果切换到 zsh 是一个选项: