从历史上看,炮弹伯恩没有true和false内置的命令。true取而代之的是简单地别名到:和false诸如之类的东西let 0。
:比true可移植到古代伯恩衍生炮弹要好一些。举一个简单的例子,考虑既不使用!管道运算符也不使用||列表运算符(某些古老的Bourne壳就是这种情况)。这使该语句的else子句if成为基于退出状态进行分支的唯一方法:
if command; then :; else ...; fi
由于if需要非空then子句,并且注释不算作非空,因此:用作无操作。
如今(即:在现代环境中),您通常可以使用:或true。两者都是由POSIX指定的,有些true更易于阅读。然而,有一个有趣的差异::是所谓的POSIX 内置特殊,而true是一个常规内置。
需要在外壳中内置特殊的内置插件。常规的内置程序只是“通常”内置的,但并不能严格保证。在大多数系统的PATH中,通常不应该有一个以:功能命名的常规程序true。
可能最关键的区别在于,使用特殊的内置程序,即使在简单的命令评估过程中,内置程序设置的任何变量(即使在环境中)也将在命令完成后仍然存在,如以下使用ksh93所示:
$ unset x; ( x=hi :; echo "$x" )
hi
$ ( x=hi true; echo "$x" )
$
请注意,除了在POSIX兼容模式下进行操作外,Zsh会与GNU Bash一样忽略此要求,但所有其他主要的“ POSIX sh派生”主外壳程序都遵守此要求,包括破折号,ksh93和mksh。
另一个区别是常规的内置程序必须与exec- 兼容,此处使用Bash进行了演示:
$ ( exec : )
-bash: exec: :: not found
$ ( exec true )
$
POSIX还明确指出这:可能比快true,尽管这当然是特定于实现的细节。