以毫秒为单位的 Bash 睡眠

Posted

技术标签:

【中文标题】以毫秒为单位的 Bash 睡眠【英文标题】:Bash sleep in milliseconds 【发布时间】:2015-11-19 12:29:43 【问题描述】:

我需要一个能以毫秒为单位的计时器。我尝试在脚本中使用sleep 0.1 命令,但看到以下错误消息:

syntax error: invalid arithmetic operator (error token is ".1")

当我在终端中运行 sleep 0.1 时,它工作正常。

请帮帮我!

编辑: 对不起,我犯了一个错误:

function timer

while [[ 0 -ne $SECS ]]; do
    echo "$SECS.."
    sleep 0.1
    SECS=$[$SECS-0.1]
done

sleep 0.1 是第 5 行,SECS=$[$SECS-0.1] 是第 6 行。我只是乱码。问题出在第 6 行,因为 bash 不能处理浮点数。我改变了我的功能如下:

MS=1000
function timer

while [[ 0 -ne $MS ]]; do
    echo "$SECS.."
    sleep 0.1
    MS=$[$MS-100]
done

【问题讨论】:

运行脚本的shell是什么?是/bin/sh 而不是/bin/bash?脚本甚至是 shell 脚本吗? sleep 不会产生语法错误。请显示产生错误的最小脚本。 请添加脚本的第一行并说明如何启动脚本。 @EtanReisner:没关系。 sleep 不是内置的 bash,因此无论您使用哪个 shell,sleep 0.1 都应该可以正常工作,只要您的 $PATH 中有合适的 sleep 命令即可。 不要只向我们展示脚本的第一行。向我们展示整个脚本。如果可能,将其修剪为产生问题的简短的独立版本(如果它超过 5 行,您可能没有修剪得足够多)。 @赛勒斯 【参考方案1】:

确保您在 Bash 中运行脚本,而不是 /bin/sh。例如:

#!/usr/bin/env bash
sleep 0.1

换句话说,尝试明确指定 shell。然后运行:./foo.shbash foo.sh

如果sleep 是别名或函数,请尝试将sleep 替换为\sleep

【讨论】:

【参考方案2】:

一些选项:

read -p "Pause Time .5 seconds" -t 0.5

read -p "Continuing in 0.5 Seconds...." -t 0.5
echo "Continuing ...."

【讨论】:

读取:0.5:无效超时规范GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin14)【参考方案3】:

Bash 抱怨十进制值,

读取:0.5:无效超时规范

我想到了this 解决方案,效果很好。

sleep_fraction() 
  /usr/bin/perl -e "select(undef, undef, undef, $1)"


sleep_fraction 0.01428

【讨论】:

以上是关于以毫秒为单位的 Bash 睡眠的主要内容,如果未能解决你的问题,请参考以下文章

罗技 lua 可靠睡眠

shell里面有没有比sleep短的

睡眠并检查直到条件为真

TimeUnit枚举类

以纳秒为单位测量纪元时间 - Android

iOS4上的C语言毫秒睡眠