我想让我的 shell 脚本无限等待,并认为下面的代码可以做到这一点。
#!/bin/bash
while true
do
done
但是,上述脚本报告语法错误。
./Infinite_Loop.sh:第 4 行:意外标记"完成"附近的语法错误
./Infinite_Loop.sh:第 4 行:"完成">
与编程语言不同,为什么 shell 脚本在循环中至少需要一个语句?
另一种选择是设置一个NOP(no op(,基本上什么都不做。
在 bash 中,NOP 的等效值是:
。
while true; do
:
done
让我的 shell 脚本无限等待
如果您的系统支持,请使用:
sleep infinity
如果您的系统不支持它,请使用间隔较大的sleep
:
while :; do sleep 86400; done
注意:
- 使用
while :
代替while true
可能会/将删除不必要的fork
,具体取决于true
的实现方式(内置于 shell 中,或作为独立的应用程序(。
您正在尝试实现繁忙循环,请勿执行此操作。
繁忙循环将:
- 将 100% CPU 用于无用目的
- 防止其他任务获取 CPU 时间
- 降低整个系统的感知性能
- 使用超过必要的功率,尤其是在支持动态频率缩放的系统上
为什么空循环在 shell 脚本中无效?
因为它是...bash
中while
循环的格式如下:
while list-1; do list-2; done
如果不提供list-2
,则没有格式正确的while
循环。
正如其他人所指出的,使用noop(:
(或其他任何东西来满足list-2
。
:
记录如下:
: [arguments]
No effect; the command does nothing beyond expanding arguments and performing any
specified redirections. A zero exit code is returned.
它不是 Bash 语法的一部分。手册告诉我们:
while 命令的语法为:
while test-commands; do consequent-commands; done
事实上,如果你深入研究 Bash 源代码,你会发现它是如何解析while loop
的:
shell_command: ...
| WHILE compound_list DO compound_list DONE
如果你检查compound_list
的定义,你可以看到它必须至少包含一个shell指令;它不能是空的。
没有理由编写一个空(无限(循环,除非你想加热你的CPU并耗尽你的电池。这可能就是 Bash 不允许空循环的原因。
正如其他人所说,您可以使用true
或:
(后者是前者的别名(:
while true; do true; done
while :; do :; done
再次使用 true,从它的手册页: true - 什么都不做,成功
while true; do true; done