一个不执行任何操作的命令的目的是什么,它只不过是一个注释领导者,但实际上它本身就是一个内置的 shell?
它比每次调用在脚本中插入注释要慢大约 40%,这可能会根据注释的大小而有很大差异。我能看到的唯一可能的原因是:
# 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
我想我真正想要的是它可能有什么历史应用。
历史上, 伯恩炮弹没有true
and false
作为内置命令。true
相反,只是简单地别名为:
, and false
类似的东西let 0
.
:
略好于true
以便移植到古老的 Bourne 衍生的 shell。举一个简单的例子,考虑既没有!
管道运营商也不是||
列表运算符(就像一些古老的 Bourne shell 的情况一样)。这使得else
的条款if
语句作为基于退出状态进行分支的唯一方法:
if command; then :; else ...; fi
Since if
要求非空then
子句和注释不算为非空,:
充当空操作。
Nowadays(即:在现代环境中)您通常可以使用:
or true
。两者都是 POSIX 指定的,有些发现true
更容易阅读。然而,有一个有趣的区别::
是所谓的 POSIX特殊内置, 然而true
is a 常规内置.
需要在外壳中内置特殊的内置函数;常规内置函数只是“通常”内置的,但并不能严格保证。通常不应该有一个名为:
与功能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
,尽管这当然是特定于实现的细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)