For the longest time, I assumed the sleep command only accepted whole integers as an argument. When I was trying to find a way to make a script pause for less than one second, I found that this is not true. That was silly of me. But, I assume, there are more people like me, that make this assumption. So here is a little writeup about how you can make bash sleep for half a second or less
Although some, mostly older, implementations of sleep only accept whole minutes as arguments, GNU sleep accepts arbitrary floating point values as well. So “sleep 0.5” will make the script pause for half a second.
I don’t know why I assumed this was not possible. But for future reference, I have included some examples of how you can use different values for sleep. There are also some alternative methods at the bottom if your version of sleep only supports whole minutes.
Sleep for half a minute
Sleep for one tenth of a second
Sleep for a millisecond
Sleep using scientific e notation
Unbelievably, sleep also accepts scientific e notation. This could be useful if you need to pass very small values. In the example, here below, we tell sleep to pause for 0.001 seconds (millisecond).
Sleep using arithmetictic operations
If you want you can always have bash calculate the value for you as well. Like in this case we want to have the script pause for one-fifth of a second.
sleep $(( 1/5 ))
For longer periods, you can also use suffixes to make the commands shorter. Otherwise, you would have to calculate how many seconds there are in the time you want. Like 600 seconds for 10 minutes. Instead, you can just write “sleep 10m” or “sleep 1d” for one day instead of “sleep 86400”.
So you could write something like this if you wanted to pause for one year. I have a hard time thinking of reasons why you would want to do this. But you never know!
Sleep for one year
This would make your script pause for a whole year. Assuming it is not a leep year.
Use usleep as an alternative
If your version of sleep only accepts whole integers as arguments, you can also use usleep. That is if that is available on your system. Not all *nix systems have usleep by default.
usleep takes microseconds as arguments instead of seconds. The default value, if you don’t specify any argument is 1 microsecond. Here are a couple of examples.
Use usleep to sleep for half a second (half a million microseconds):
Use usleep to sleep for one millisecond (one thousand microseconds):
Use pythons sleep function
If all else fails you could use call some other scripting language that accepts floating point numbers as arguments. Python is one such language. You need to import the time module to get access to the sleep function. But this can all be done on one line.
Sleep using python instead of bash
python -c 'import time; time.sleep(0.5)'
Of course, there are many other scripting languages you could use. Some of them, like Perl, need to have an extra dependency installed to be able to sleep for less than a whole second.
If you have GNU sleep on your system, you can easily pass values smaller than one. Thereby pausing your script for less than a second. If you are running some other Unix operating system other than Linux, you have some other alternatives like usleep or another scripting language like python.