

I ended up writing my own shell script: GitHub gist #!/bin/sh To fix this problem, one must each loop iteration compute the precise time to sleep which is usually slightly less than a second (for one second interval timers). This error slowly accumulates and would over time make our stopwatch timer more and more imprecise. Even if one would just sleep 1 in a loop 10 times, the overall execution would take a bit more than 10 seconds because of the small overhead that comes from executing sleep and iterating the loop. The advantage of sleepenh is, that it is able to take into account the small delay that accumulates over time from the processing of other things than the sleep during a loop.


For distributions that don't have it, it comes from The sleepenh tool comes from the package of the same name in Debian and its derivatives like Ubuntu. So for example you can say: $ time countdown 2m 4.6sĬountdown 2m 4.6s 0.00s user 0.00s system 0% cpu 2:04.60 totalĪnd as you can see, the command ran exactly for 2 minutes and 4.6 seconds without much magic in the script itself. On Debian and derivatives, this includes sub-second sleeps and a nice human-readable way to specify the time. Since the sleep command is used, this script allows to specify the duration for which to count in the same precision as your sleep allows. The script can either be used as a stop watch (counting up until interrupted) or as a timer that runs for the specified amount of time. The tool that I have in my $PATH looks like this: #!/bin/sh The latter is inadequate because it keeps the CPU busy for no good reason.

After enough time passed, the counter will skip a second. The former is inadequate because due to the small time spent doing the printing, the output will not actually happen once per second but a bit less than that which is suboptimal. Instead, the proposed solutions either use a sleep 1 between subsequent timer outputs or a busy loop that outputs as fast as possible. I'm surprised that nobody used the sleepenh tool in their scripts. In bash, add these lines to your ~/.bashrc (the sleep 0.1 will make the system wait for 1/10th of a second between each run so you don't spam your CPU): countdown() ))Ĭombine this with some way of playing sound in linux terminal ( Play MP3 or WAV file via the Linux command line) or Cygwin ( cat /path/foo.wav > /dev/dsp works for me in Babun/Windows 7) and you have a simple flexible timer with alarm! You can combine these into simple commands by using bash (or whichever shell you prefer) functions. If you need greater precision, you can use this to give you nanoseconds: while true do printf '%s\r' "$(date +%H:%M:%S:%N)" doneįinally, if you really, really want "stopwatch format", where everything starts at 0 and starts growing, you could do something like this: start=$(date +%s)įor a countdown timer (which is not what your original question asked for) you could do this (change seconds accordingly): seconds=20 That will show you the seconds passing in realtime and you can stop it with Ctrl+ C. If all you want is a stopwatch, you can do this: while true do printf '%s\r' "$(date)" done
