我在VS Code文档中看到了这行脚本。
while sleep 1000; do :; done
我知道这一行的功能是防止进程退出。但是我不懂语法。你能帮我解释一下剧本吗?你对学习破折号语法有什么建议吗?
:
是一个shell内置,代表true
。true
命令不执行任何操作,执行成功(返回0)。
while
命令的语法如下:
while command1 ; do command2 ; done
执行command1
,完成后,shell检查命令是否成功或失败。在第一种情况下,执行command2
,然后再次触发command1
,否则循环停止。
在你的例子中,sleep 1000
等待1000秒,成功,然后true
被调用,然后循环被一次又一次地调用(sleep
永远不会失败,这是一个无限循环)。
这种单行代码实际上可能对保持脚本存活有好处,同时运行其他东西,如协例程或信号陷阱;这是非常经济的,因为在sleep
期间,进程被停止:这里每1000秒,进程被恢复并再次停止。
:
是shell的null命令。它除了评估它的参数和重定向之外什么都不做。然后返回true。这有三个用途:
- 当您出于语法原因需要一个命令,但不想执行任何命令时。
- 当您想要执行某些参数展开时。
- 当你想截断一个文件时。
1的用例。
while :; do
someCommand
done
重复运行某个命令,直到时间结束。
另一个原因是
while someCommand; do
:
done
运行一些命令,直到它失败。
2的用例。正在为变量设置默认值,如
所示: ${EDITOR:=vi}
指定EDITOR=vi
,除非它已设置或为空。
3的用例。
: >file
截断文件。许多shell允许非posix变体>file
,但可移植脚本不应该依赖于它。
下面是一些来自https://www.gnu.org/software/bash/manual/bash.html#Shell-Syntax:的引语来解释你的问题
while命令的语法为:
while test-commands; do consequent-commands; done
执行后果命令只要test-commands退出状态为零。返回状态为result -commands中最后执行的命令的退出状态,或
,—语句之间可以用分号分隔。以分号分隔的命令依次执行;壳在等待对于每个命令依次终止。返回状态为退出最后一次执行命令的状态。
:-如果语句中包含冒号,操作符将测试两个参数是否存在,且其值是否为空;如果省略冒号,操作符只测试是否存在。