所以,正如标题所示,我注意到了这一点诡异的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 未设置,它将失去其特殊属性,即使随后重置也是如此。
因此,通过设置SECONDS
,1
您可以重新启动计数器,该计数器现在从 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
是
- 一个糟糕的变量名;使它与 Bash 内置的“SECONDS”混淆。
- 是命令的一个参数
sleep
。
该sleep
命令默认以秒为单位。通过分配SECONDS
一个值1
then 将其传递给sleep
命令,它会暂停 while 循环的处理 1 秒,然后重新处理循环等,直到满足条件。
要测试这一点,只需打开终端并输入sleep 1
并点击ENTER
。 shell 将暂停 1 秒,然后将光标返回给您。