Linux “我怎么能?”;延迟“;在Zsh中使用浮点数?

Linux “我怎么能?”;延迟“;在Zsh中使用浮点数?,linux,shell,zsh,sleep,Linux,Shell,Zsh,Sleep,在Zsh中有一个等待(对于进程或作业)命令、一个while(秒==延迟)命令和一个sched(如果shell仍在运行,则稍后执行)命令,但没有“延迟”命令。如果有的话,我担心它将被限制在整个第二次延迟。我需要一个“delay”语句,它基本上可以导致过程/任务在固定点编号中指定的时间内或在某个时钟时间之前几乎不执行任何操作 大多数脚本都会使用“sleep”,但我希望在不打开IO的情况下运行延迟计时器;我追求的理想是,几乎任何事情都可以在Zsh内部完成 有人知道如何让函数(或内置模块)以秒为单位执行

在Zsh中有一个
等待
(对于进程或作业)命令、一个
while
(秒==延迟)命令和一个
sched
(如果shell仍在运行,则稍后执行)命令,但没有“延迟”命令。如果有的话,我担心它将被限制在整个第二次延迟。我需要一个“delay”语句,它基本上可以导致过程/任务在固定点编号中指定的时间内或在某个时钟时间之前几乎不执行任何操作

大多数脚本都会使用“sleep”,但我希望在不打开IO的情况下运行延迟计时器;我追求的理想是,几乎任何事情都可以在Zsh内部完成


有人知道如何让函数(或内置模块)以秒为单位执行浮点空闲延迟吗?

我认为你的假设是错误的
zsh
是一个shell,因此它的目的是作为shell。作为shell的一个重要方面是成为与POSIX兼容的shell。此外,由于
zsh
bash
完全向后兼容,而bash又与bourne shell完全向后兼容,bourne shell应该是Poiss shell

这意味着
zsh
必须能够访问
sleep
since

这就是POSIX兼容性参数的范围。现在是一个实际使用的论点。大多数系统将用于实现允许浮点参数的
sleep
。因此,以下是POSIX便携式:

if ! sleep 0.03; then
    sleep 1
fi

并且在大多数情况下应该作为细粒度延迟工作,而在少数情况下操作系统不使用GNU coreutils时仍然不会中断。据我所知,这些罕见的情况只是AIX和HP-UX系统。

我认为您的假设是错误的
zsh
是一个shell,因此它的目的是作为shell。作为shell的一个重要方面是成为与POSIX兼容的shell。此外,由于
zsh
bash
完全向后兼容,而bash又与bourne shell完全向后兼容,bourne shell应该是Poiss shell

这意味着
zsh
必须能够访问
sleep
since

这就是POSIX兼容性参数的范围。现在是一个实际使用的论点。大多数系统将用于实现允许浮点参数的
sleep
。因此,以下是POSIX便携式:

if ! sleep 0.03; then
    sleep 1
fi

并且在大多数情况下应该作为细粒度延迟工作,而在少数情况下操作系统不使用GNU coreutils时仍然不会中断。据我所知,这些罕见的情况仅限于AIX和HP-UX系统。

似乎只要I/O限于内置,I/O就不会产生明显的延迟,并且不依赖于Zsh之外的任何东西。通过grochmal的有用输入和大量实验,我为
读取
内置命令和
(null)内置命令提供了一个简单的循环文件描述符:

: $(read -u 1 -t 10)
标准的out-of-read命令作为
(null)的参数连接到Zsh进行扩展,因此保证不接收任何输入。由于知道它永远不会接收输入,我们使用
read
命令通过
-u1
监听标准输出。Zsh
read
的超时选项接受浮点数;在任何运行Zsh的系统上,它都应该是一致的。最后,即使shell选项ERREXIT位于
读取
超时故障状态,也不应该是问题,因为
读取
实际上是在子shell中运行的,无论如何都要结束,
始终返回true。如果启用了ERRRETURN选项,我还不知道该行为,但修复方法是在
读取
命令的末尾添加
|;:

现在可以为匿名函数创建一个函数或别名,该函数解释任何形式的参数或输入,以可靠地创建以秒为单位的浮点延迟:

# function sleep {    -- optional switch-out for the system command
#                        after POSIX & GNU compatibility verified.
function delay {
   emulate -LR zsh -o extendedglob -o nullglob
   local Delay=1.
   if [[ $1 == (#b)([[:digit:]](#c1,).(#c0,1)[[:digit:]](#c0,))(s|m|h|d|w|) ]]
   then
      if [[ $match[2] == (s|) ]] Delay=$match[1]
      if [[ $match[2] == (m) ]] Delay=$[ $match[1] * 60. ** 1 ]
      if [[ $match[2] == (h) ]] Delay=$[ $match[1] * 60. ** 2 ]
      if [[ $match[2] == (d) ]] Delay=$[ ($match[1] * 60. ** 2) * 24 ]
      if [[ $match[2] == (w) ]] Delay=$[ (($match[1] * 60. ** 2) * 24) * 7 ]
      : $(read -u 1 -t $Delay)
   else
      print -u 2 "Invalid delay time: $1"
      return 1
   fi
}

似乎只要I/O仅限于内置,I/O就不会产生明显的滞后,并且不依赖于Zsh之外的任何东西。通过grochmal的有用输入和大量实验,我为
读取
内置命令和
(null)内置命令提供了一个简单的循环文件描述符:

: $(read -u 1 -t 10)
标准的out-of-read命令作为
(null)的参数连接到Zsh进行扩展,因此保证不接收任何输入。由于知道它永远不会接收输入,我们使用
read
命令通过
-u1
监听标准输出。Zsh
read
的超时选项接受浮点数;在任何运行Zsh的系统上,它都应该是一致的。最后,即使shell选项ERREXIT位于
读取
超时故障状态,也不应该是问题,因为
读取
实际上是在子shell中运行的,无论如何都要结束,
始终返回true。如果启用了ERRRETURN选项,我还不知道该行为,但修复方法是在
读取
命令的末尾添加
|;:

现在可以为匿名函数创建一个函数或别名,该函数解释任何形式的参数或输入,以可靠地创建以秒为单位的浮点延迟:

# function sleep {    -- optional switch-out for the system command
#                        after POSIX & GNU compatibility verified.
function delay {
   emulate -LR zsh -o extendedglob -o nullglob
   local Delay=1.
   if [[ $1 == (#b)([[:digit:]](#c1,).(#c0,1)[[:digit:]](#c0,))(s|m|h|d|w|) ]]
   then
      if [[ $match[2] == (s|) ]] Delay=$match[1]
      if [[ $match[2] == (m) ]] Delay=$[ $match[1] * 60. ** 1 ]
      if [[ $match[2] == (h) ]] Delay=$[ $match[1] * 60. ** 2 ]
      if [[ $match[2] == (d) ]] Delay=$[ ($match[1] * 60. ** 2) * 24 ]
      if [[ $match[2] == (w) ]] Delay=$[ (($match[1] * 60. ** 2) * 24) * 7 ]
      : $(read -u 1 -t $Delay)
   else
      print -u 2 "Invalid delay time: $1"
      return 1
   fi
}

为了完全挑剔,在Ada中,你会延迟一段时间(或直到某个时间)。两者都不是浮点数;持续时间是固定的。这是一个问题还是一篇文章?如果去掉80-90%的话,这个问题会得到改进。Ada和Zsh的优点与你的问题无关,你的问题其实很简单:在Zsh中能睡上几秒钟吗?如果你愿意,我可以通过删除不必要的语句来缩短我的问题。。。完成。问题,而不是文章;我有一种很罗嗦的倾向,我没有欲望