sleep 是一个非常流行的命令,我们可以从 1 秒开始睡眠:
# wait one second please
sleep 1
但是如果我只需要等待 0.1 秒或 0.1 到 1 秒之间,还有什么其他选择呢?
- 备注:在 Linux 或 OS X 上
sleep 0.XXX
工作正常,但在 Solaris 上sleep 0.1
或者sleep 0.01
- 非法语法
答案1
Bash 具有“可加载”睡眠功能,支持秒的小数部分,并消除了外部命令的开销:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
然后:
$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real 0m1.000s
user 0m0.004s
sys 0m0.004s
缺点是可加载文件可能不会随您的bash
二进制文件提供,因此您需要按照所示自行编译它们(尽管在 Solaris 上它不一定像上面那么简单)。
作为bash-4.4
(2016 年 9 月)现在所有可加载文件都默认在支持它的平台上构建和安装,尽管它们是作为单独的共享对象文件构建的,并且没有后缀.so
。除非您的发行版/操作系统做了一些有创意的事情(遗憾的是 RHEL/CentOS 8bash-4.4
带有可加载扩展故意地删除),你应该可以这样做:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(手册页暗示BASH_LOADABLES_PATH
是自动设置的,我发现在 4.4.12 版的官方发行版中情况并非如此。如果设置正确,您只需要按enable -f filename commandname
要求进行即可。)
如果这不合适,下一个最简单的方法是sleep
从 GNU coreutils 构建或获取,这支持所需的功能。POSIXsleep
命令是最小的,旧的 Solaris 版本只实现了这一点。Solaris 11sleep
做支持秒的小数部分。
作为最后的手段,您可以使用perl
(或任何其他您必须使用的脚本),但需要注意的是,初始化解释器可能与预期的睡眠时间相当:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
答案2
答案3
Sleep 接受十进制数,因此您可以将其分解如下:
1/2 秒
sleep 0.5
1/100 秒
sleep 0.01
所以你会想要一毫秒
sleep 0.001
答案4
您可以简单地使用usleep
。它以微秒(= 1e-6 秒)作为参数,因此要休眠 1 毫秒,您需要输入:
usleep 1000