如何创建秒表Bash脚本以持续显示已用时间?

jer*_*rzy 4 bash time stopwatch elapsedtime

你可以把它想象成一个非常简单的秒表.我试图破解一个bash脚本,它显示自指定日期以来经过的时间并每秒更新输出.

首先,在脚本内部指定一个UNIX日期:Fri Apr 14 14:00:00 EDT 2011.这将是秒表开始的时候.

现在,当你运行脚本时,你会看到......

06d:10h:37m:01s

几秒钟后你会看到......

06d:10h:37m:05s

我不打算每过一秒就打印一条新线.该脚本应该只有1行输出,并且每秒更新一次.显然你可以随时退出脚本并重新启动它,因为开始时间是硬编码的,所以它仍然是正确的.

有任何想法吗?

Fri*_*ner 5

我在长时间运行的脚本中使用以下代码片段.定时器在一个函数(单独的进程)中运行,如果主进程被keybord中断终止,它将被终止(陷阱).输出显示从计时器开始经过的时间:

... working [hh:mm:ss]  00:07:58
Run Code Online (Sandbox Code Playgroud)

片段:

#===  FUNCTION  ================================================================
#          NAME:  progressIndicatorTime
#   DESCRIPTION:  Display a progress indicator with seconds passed.
#    PARAMETERS:  [increment]   between 1 and 60 [sec], default is 2 [sec]
#===============================================================================
function progressIndicatorTime ()
{
  declare default=2                                       # default increment [sec]
  declare increment="${1:-$default}"                      # 1. parameter or default
  declare format='\b\b\b\b\b\b\b\b%02d:%02d:%02d'         # time format hh:mm:ss
  declare timepassed=0
  declare seconds minutes hours

  [[ ! "$increment" =~ ^([1-9]|[1-5][0-9]|60)$ ]] && increment=$default
  printf " ... working [hh:mm:ss]  00:00:00"
  while : ; do                                            # infinite loop 
    ((seconds=timepassed%60))
    ((minutes=timepassed/60))
    ((hours=minutes/60))
    ((minutes=minutes%60))
    printf "$format" $hours $minutes $seconds
    sleep $increment || break                             # sleep ...
    ((timepassed+=increment))
  done
}    # ----------  end of function progressIndicatorTime  ----------

progressIndicatorTime &                                   # run progress indicator
declare progressIndicatorPid=${!}                         # save process ID
trap  "kill $progressIndicatorPid" INT TERM               # trap keyboard interrupt

#
# run long command
#

kill -s SIGTERM $progressIndicatorPid                     # terminate progress indicator
Run Code Online (Sandbox Code Playgroud)