首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么shell脚本中的空循环无效?

为什么shell脚本中的空循环无效?
EN

Stack Overflow用户
提问于 2017-07-07 12:04:51
回答 4查看 8.4K关注 0票数 6

我想让shell脚本无止境地等待,并认为下面的代码可以做到这一点。

代码语言:javascript
复制
#!/bin/bash
while true
do
done

但是,上面的脚本报告语法错误。

./InfiniteLoop.sh:第4行:未预料到的令牌done' ./Infinite\_Loop.sh: line 4:完成时的语法错误

与编程语言不同的是,为什么shell脚本希望循环中至少有一条语句?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-07 12:15:30

我想让我的shell脚本无限等待

如果您的系统支持它,请使用:

代码语言:javascript
复制
sleep infinity

如果您的系统不支持它,请使用大间隔的sleep

代码语言:javascript
复制
while :; do sleep 86400; done

注意:

  • 使用while :代替while true可能/将删除不必要的fork,这取决于true是如何实现的(构建在shell中,还是作为独立的应用程序)。

您正在尝试实现一个繁忙的循环,不执行这个

一个繁忙的循环将:

  • 将100%的CPU用于无用的用途
  • 防止其他任务获得CPU时间
  • 降低整个系统的感知性能
  • 使用比需要更多的电源,特别是支持动态频率标度的系统。

为什么shell脚本中的空循环无效?

因为它是..。while循环在bash中的格式如下:

代码语言:javascript
复制
while list-1; do list-2; done

如果不提供list-2,那么就没有一个格式正确的while循环。

正如其他人所指出的,使用noop (:)或其他任何东西来满足list-2

:记录如下:

代码语言:javascript
复制
: [arguments]
    No effect; the command does nothing beyond expanding arguments and performing any
    specified redirections.  A zero exit code is returned.
票数 8
EN

Stack Overflow用户

发布于 2017-07-07 12:15:10

另一种选择就是设置NOP(NOP),这基本上是什么都不做。

在bash中,NOP的等效值是:

代码语言:javascript
复制
while true; do
  :
done
票数 10
EN

Stack Overflow用户

发布于 2017-07-07 12:40:40

这不是Bash语法的一部分。手册告诉我们:

while命令的语法是: 同时执行测试命令;执行后续命令;完成

实际上,如果您深入挖掘Bash源代码,您可以找到while loop

代码语言:javascript
复制
shell_command:  ...
    |   WHILE compound_list DO compound_list DONE

如果您检查[医]定义,可以看到它必须包含至少一个shell指令;它不能是空的。

没有理由写一个空(无限)循环,除非你想加热你的CPU和耗尽你的电池。这可能就是Bash不允许空循环的原因。

正如其他人所说的,您可以使用true: (后者是前者的别名。):

代码语言:javascript
复制
while true; do true; done
while :; do :; done
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44970342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档