Answers:
要将bash中的分数从小数转换为小数,请执行以下操作
myvar=$(echo "scale=4; 5/10" | bc)
然后,要对该值进行循环,
for i in $(seq 1 1000); do sleep $myvar; done
我在Debian(GNU)上的睡眠实现似乎接受十进制睡眠值。
不幸..
有了这种精度(小数点后4-5位),您将需要像perl脚本或编译程序这样的东西;在循环内调用任何程序的开销都会增加很多抖动。调用睡眠本身将花费几毫秒的时间。
考虑以下情况,即每秒睡眠的十分之一/ 10,000,已完成1000次:
time for i in $(seq 1 1000); do sleep 0.0001; done
real 0m2.099s
user 0m3.080s
sys 0m1.464s
预期的结果将是1/10秒。睡眠远没有您想要的公差。
/programming/896904/how-do-i-sleep-for-a-millisecond-in-perl
使用perl的Time :: HiRes,1000 * 1000微秒:
my $i=0;
for($i=0;$i<=1000;$i++) {
usleep(1000);
}
real 0m1.133s
user 0m0.024s
sys 0m0.012s
使我们接近一秒钟。
也许您可以简单地运行
sleep 0.7
?
man 1 sleep
在我的archlinux
发行版上:
描述暂停NUMBER秒。SUFFIX可能是“ s”代表秒(默认值),“ m”代表分钟,“ h”代表小时或“ d”代表天。与大多数要求NUMBER为整数的实现不同,这里NUMBER可以是任意浮点数。给定两个或多个参数,暂停它们的值总和指定的时间。
sleep
允许分数?您能提供一个带有假循环的完整示例吗?
生成一个进程并在其中加载新的可执行文件可能需要花费几毫秒的时间,因此这种精确度实际上没有任何意义。还要注意,在许多系统上,CPU时间最多以10毫秒为片分配给进程。
话虽如此,有些sleep
实现只需要秒的分数,并且zsh和ksh93都可以使用来使它们的$SECONDS
特殊变量分数typeset -F SECONDS
。
示例(zsh):
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000
糟糕,它漂移了。您可以根据以下方法调整睡眠时间$SECONDS
:
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000
这两个额外的毫秒可能是由于运行last sleep
和date
命令造成的。
另请注意,zsh具有一个zselect
内置的超时机制,以百分之一秒表示。并且ksh93具有sleep
内置功能(并接受浮点数),并且printf
可以打印日期/时间。
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685
如果您需要更精确的信息,则可能需要使用实时操作系统或具有实时功能并且肯定不使用外壳程序的操作系统。
sleep 1/70
不允许在我的机器上...
在Alpine Linux(Busybox)下,您可以循环微秒usleep 10
(相当于0.00001
1秒)
GNU sleep
支持几分之一秒: sleep 0.00001