sleep 是一个非常流行的命令,我们可以从 1 秒开始睡眠:
# wait one second please
sleep 1
但是如果我只需要等待 0.1 秒或 0.1 到 1 秒之间,还有什么选择呢?
- 备注:在 linux 或 OS X 上
sleep 0.XXX
工作正常,但在 solarissleep 0.1
或sleep 0.01
- 非法语法
sleep 是一个非常流行的命令,我们可以从 1 秒开始睡眠:
# wait one second please
sleep 1
但是如果我只需要等待 0.1 秒或 0.1 到 1 秒之间,还有什么选择呢?
sleep 0.XXX
工作正常,但在 solarissleep 0.1
或sleep 0.01
- 非法语法
来自coreutils
sleep
命令的文档说:因此,您可以使用
sleep 0.1
,sleep 1.0e-1
和类似的参数。Bash 有一个支持小数秒的“可加载”睡眠,并消除了外部命令的开销:
然后:
缺点是您的二进制文件可能不提供可加载
bash
文件,因此您需要自己编译它们,如图所示(尽管在 Solaris 上它不一定像上面那样简单)。从
bash-4.4
(2016 年 9 月)开始,所有可加载文件现在都默认构建并安装在支持它的平台上,尽管它们是作为单独的共享对象文件构建的,并且没有.so
后缀。除非你的发行版/操作系统做了一些有创意的事情(遗憾的是 RHEL/CentOS 8 构建时故意bash-4.4
删除了可加载的扩展),否则你应该可以这样做:(手册页暗示
BASH_LOADABLES_PATH
是自动设置的,我发现在 4.4.12 的官方发行版中情况并非如此。如果设置正确,您只需要enable -f filename commandname
根据需要。)如果这不合适,那么下一个最简单的事情就是构建或
sleep
从 GNU coreutils 获取,它支持所需的功能。POSIXsleep
命令是最小的,旧的 Solaris 版本只实现了它。Solaris 11sleep
不支持小数秒。作为最后的手段,您可以使用
perl
(或您必须提供的任何其他脚本)并注意初始化解释器可能与预期的睡眠时间相当:Sleep 接受十进制数,因此您可以将其分解为:
1/2 秒
1/100 秒
所以你会想要一毫秒
试试这个来确定准确性:
mr.spuratic 的解决方案和coles 的解决方案的组合。
您可以简单地使用
usleep
. 它需要微秒(= 1e-6 秒)作为参数,因此要休眠 1 毫秒,您可以输入:我有同样的问题(在 Solaris 上没有 shell usleep)所以我写了自己的:
不检查参数 - 如果您想保留它,我会推荐一个正确编写的参数,但是 (gcc usleep.c -o usleep) 会让您摆脱困境。
我喜欢 usleep 的想法,但我不能在它下面发表评论。由于这对我有所帮助,我希望我的建议可以改善 usleep 的想法。
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c是 usleep.c 在 redhat 生态系统中的实际源代码。
尝试在您的 Solaris 中编译它。您可能需要https://www.opencsw.org/packages/libpopt0/。
POSIX 规范
sleep
只接受整数参数——所以不接受小数秒。GNU 的coreutilssleep
添加了对实数、后缀、甚至科学记数法和inf
整数的支持作为GNU 扩展。但是如果你在嵌入式系统上使用busybox
或只是没有 coreutils,那么除非你有 perl,否则你就不走运了。