如何理解 "while sleep 1000; do :; done" 中用于破折号的语法?

How to understand syntax used in "while sleep 1000; do :; done" for dash?

我在 VS Code 文档的 tutorial 中看到了这行脚本。

while sleep 1000; do :; done

我知道这行的功能是防止进程退出。但我不明白语法。你能帮忙解释一下脚本吗?您对学习破折号语法有什么建议吗?

这里引用了一些引文来解释你的问题 https://www.gnu.org/software/bash/manual/bash.html#Shell-Syntax:

The syntax of the while command is:

while test-commands; do consequent-commands; done

Execute consequent-commands as long as test-commands has an exit status of zero. The return status is the exit status of the last command executed in consequent-commands, or zero if none was executed.


; - You can use semicolons to separate statements. Commands separated by a semicolon are executed sequentially; the shell waits for each command to terminate in turn. The return status is the exit status of the last command executed.

: - If the colon is included in a statement, the operator tests for both parameters' existence and that its value is not null; if the colon is omitted, the operator tests only for existence.

: 是一个 shell 内置函数,代表 truetrue 命令不执行任何操作并成功(返回 0)。

while 命令遵循语法:

while command1 ; do command2 ; done

执行command1,完成后,shell检查命令是成功还是失败。在第一种情况下,执行 command2,然后再次触发 command1,否则循环停止。

在你的例子中,sleep 1000等待1000秒,成功,然后调用true,然后循环调用一次又一次(sleep永远不会失败,这是无限循环)。

事实上,这种单行代码可能对保持脚本有效很有意义,而 运行 其他东西,如协同例程或信号陷阱;这是非常经济的,因为在 sleep 期间,进程停止:这里每 1000 秒,进程恢复并再次停止。

: 是 shell 的 null 命令。除了评估其参数和重定向之外,它什么都不做。然后 returns 为真。这用于三个目的:

  1. 当您出于句法原因需要命令,但又不想执行任何命令时。
  2. 当您想执行某些参数扩展时。
  3. 当您只想截断文件时。

1 的一个用例是

while :; do
    someCommand
done

这将重复运行 someCommand 直到时间结束。

另一个是

while someCommand; do
    :
done

运行一些命令直到它失败

2. 的一个用例是为变量设置默认值,如

: ${EDITOR:=vi}

这将分配 EDITOR=vi 除非它已经设置或为空。

3 的一个用例是

: >file

截断文件。许多 shell 允许非 POSIX 变体 >file 但可移植脚本不应依赖它。