从历史上看,炮弹伯恩没有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
,尽管这当然是特定于实现的细节。