睡眠是一个非常stream行的命令,我们可以从1秒开始睡觉:
# wait one second please sleep 1
但是如果我只需要等待0.1秒或者0.1秒到1秒之间的话,还有什么select呢?
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
二进制文件,所以你需要自己编译它们(尽pipe在Solaris上它不一定像上面那么简单)。
从bash-4.4
(2016年9月)开始,现在所有可加载的程序默认在支持它的平台上构build和安装,尽pipe它们是作为单独的共享对象文件构build的,没有.so
后缀。 除非您的发行版/操作系统已经做了一些创意,否则您应该可以这样做:
[ -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
。)
如果这不合适,下一个最简单的方法是从GNU coreutils构build或获取sleep
,这将支持所需的function。 POSIX sleep
命令是最小的,较早的Solaris版本只能执行该命令。 Solaris 11 sleep
确实支持小数秒。
作为最后的手段,你可以使用perl
(或任何其他脚本,你必须交出)的警告,初始化解释器可能是相当于预期的睡眠时间:
$ perl -e "select(undef,undef,undef,0.1);" $ echo "after 100" | tclsh
来自coreutils的sleep
命令文档说:
睡眠的历史实现要求这个数字是一个整数,只接受一个没有后缀的参数。 但是,GNU睡眠接受任意的浮点数。 请参阅浮点 。
因此,你可以使用sleep 0.1
, sleep 1.0e-1
和类似的论点。
睡眠接受十进制数字,所以你可以把它分解如下:
1/2秒
sleep 0.5
1/100秒
sleep 0.01
所以一毫秒你会想
sleep 0.001
试试这个来确定准确性:
time sleep 0.5 # 500 milliseconds (1/2 of a second) time sleep 0.001 # 1 millisecond (1/1000 of a second) time sleep 1.0 # 1 second (1000 milliseconds)
结合先生的解决scheme和科尔斯的解决 scheme 。
你可以简单地使用usleep
。 它需要几微秒(= 1e-6秒)作为参数,所以睡1毫秒,你会input:
usleep 1000
我有同样的问题(在Solaris上没有shell),所以我写了我自己的:
#include "stdio.h" int main(int argc, char **argv) { if(argc == 1) { usleep(atoi(argv[1])); } return 0; }
不检查参数 – 如果你想保留它,我会推荐一个正确的写法,但是(gcc usleep.c -o usleep)会让你摆脱困境。