如何在bash或ksh中睡一毫秒

睡眠是一个非常stream行的命令,我们可以从1秒开始睡觉:

# wait one second please sleep 1 

但是如果我只需要等待0.1秒或者0.1秒到1秒之间的话,还有什么select呢?

  • 备注:在linuxsleep 0.XXX工作正常,但在solaris sleep 0.1sleep 0.01 – 非法语法

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 

来自coreutilssleep命令文档说:

睡眠的历史实现要求这个数字是一个整数,只接受一个没有后缀的参数。 但是,GNU睡眠接受任意的浮点数。 请参阅浮点 。

因此,你可以使用sleep 0.1sleep 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)会让你摆脱困境。