SECONDS 变量实际上有什么作用?

SECONDS 变量实际上有什么作用?

所以,正如标题所示,我注意到了这一点诡异的sleep本质上是increment你把它作为参数给出的时间。例子:

#!/usr/bin/env bash
set -x
SECONDS="1"
while true; do
    echo "hello" || true
    sleep "$SECONDS"
done

但不可否认,这只是因为我使用了该$SECONDS变量,而不是以不同的方式命名它......从我所看到的,它所做的只是输出时钟的秒数?有点像我猜的日期。

但除此之外它实际上还有什么作用呢?我认为我没有在 Bash 文档中看到过任何有关它的内容,也没有在任何公共脚本中看到过它。

答案1

bash 手册页:

每次引用此参数时,都会返回自 shell 调用以来的秒数。如果将值分配给 SECONDS,则后续引用时返回的值是自分配以来的秒数加上所分配的值。如果 SECONDS 未设置,它将失去其特殊属性,即使随后重置也是如此。

因此,通过设置SECONDS1您可以重新启动计数器,该计数器现在从 1 开始,并随着 while 循环的每次迭代而加倍,因为变量SECONDS会随着经过的时间而增加,从而为您提供一个很好的几何序列sleep

+ SECONDS=1
+ true
+ echo hello
hello
+ sleep 1
+ true
+ echo hello
hello
+ sleep 2
+ true
+ echo hello
hello
+ sleep 4
+ true
+ echo hello
hello
...

答案2

SECONDS 的典型用途是使长时间运行的任务超时。这比计算循环迭代次数更准确,因为它避免了重复任务中花费的时间造成的漂移:

EXPIRED=$(( SECONDS + 5000 ))
while (( SECONDS < EXPIRED )); do
    #.. some repeated task.
    sleep 30
done

如果您正在执行此类操作,则在脚本中的任何位置分配给 SECONDS 都是不安全的 - 最好保留相对于原始开始时间的所有其他间隔。或者,您可以将 SECONDS 最初设置为对您更有用的任何内容,例如自当天午夜以来的秒数,如果您还想将重复任务同步到下一个完整时间单位,这将很有帮助sleep $(( 60 - SECONDS % 60 ))

为了将 SECONDS 初始化为午夜以来的秒数,我发现:

SECONDS=$(( $( date '+ 3600 * %H + 60 * %M + %S' ) ))

子壳相当特殊。他们继承父 shell 的 SECONDS 作为导出,因此他们可以更改它(例如重置为零),但父 shell 看不到这些更改。独立的 shell 脚本确实从 SECONDS=0 开始。

答案3

在这种情况下$SECONDS

  1. 一个糟糕的变量名;使它与 Bash 内置的“SECONDS”混淆。
  2. 是命令的一个参数sleep

sleep命令默认以秒为单位。通过分配SECONDS一个值1then 将其传递给sleep命令,它会暂停 while 循环的处理 1 秒,然后重新处理循环等,直到满足条件。

要测试这一点,只需打开终端并输入sleep 1并点击ENTER。 shell 将暂停 1 秒,然后将光标返回给您。

相关内容