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后缀.除非你的发行版/操作系统做了一些创意,否则你应该能够做到:
[ -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中的官方发行版不是这种情况.如果设置正确,你只需要根据需要启用-f filename commandname.)
如果这不合适,下一个最简单的事情是从GNU coreutils构建或获取睡眠,这支持所需的功能. POSIX sleep命令是最小的,较旧的Solaris版本仅实现了该命令. Solaris 11 sleep确实支持小数秒.
作为最后的手段,您可以使用perl(或任何其他必须提交的脚本),并注意初始化解释器可能与预期的睡眠时间相当:
$perl -e "select(undef,undef,undef,0.1);"
$echo "after 100" | tclsh