一个不执行任何操作的命令的目的是什么,它只不过是一个注释领导者,但实际上它本身就是一个内置的 shell?

它%27s%20比%20将%20a%20注释%20插入%20你的%20脚本%20by%20大约%2040%%20每%20调用慢%20,%20其中%20可能%20变化%20很大%20取决于%20on%20的%20大小%20%

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true'
while : ; do command ; done

我想我真正想要的是它可能有什么历史应用。

答案

Historically , 伯恩炮弹没有truefalse作为内置命令。true相反,只是简单地别名为:, 和false类似的东西let 0

:略好于true以便移植到古老的 Bourne 衍生的 shell。!管道运营商也不是||列表运算符(就像一些古老的 Bourne shell 的情况一样)。else的条款if语句作为基于退出状态进行分支的唯一方法:

if command; then :; else ...; fi

自从if需要一个非空的then子句和注释不算为非空,:充当空操作。

Nowadays (即:在现代环境中)您通常可以使用:或者truetrue更容易阅读。:是一个所谓的POSIX特殊内置 , 然而true是一个常规的内置

  • 需要在外壳中内置特殊的内置函数;:与功能true在大多数系统的 PATH 中。

  • 也许最关键的区别是,对于特殊的内置程序,内置程序设置的任何变量(即使是在简单命令评估期间的环境中)在命令完成后仍然存在,如使用 ksh93 所示:

    $ unset x; ( x=hi :; echo "$x" )
    hi
    $ ( x=hi true; echo "$x" )
    
    $
    

    请注意,Zsh 会忽略此要求,GNU Bash 也会忽略此要求,除非在 POSIX 兼容模式下运行,但所有其他主要的"POSIX sh 派生"shell 都会遵守此要求,包括 dash、ksh93 和 mksh。

  • 另一个区别是常规内置函数必须兼容exec- 此处使用 Bash 进行演示:

    $ ( exec : )
    -bash: exec: :: not found
    $ ( exec true )
    $
    
  • POSIX 还明确指出:可能比true,尽管这当然是特定于实现的细节。

来自: stackoverflow.com