一个不执行任何操作的命令的目的是什么,它只不过是一个注释领导者,但实际上它本身就是一个内置的 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 , 伯恩炮弹没有true
和false
作为内置命令。true
相反,只是简单地别名为:
, 和false
类似的东西let 0
。
:
略好于true
以便移植到古老的 Bourne 衍生的 shell。!
管道运营商也不是||
列表运算符(就像一些古老的 Bourne shell 的情况一样)。else
的条款if
语句作为基于退出状态进行分支的唯一方法:
if command; then :; else ...; fi
自从if
需要一个非空的then
子句和注释不算为非空,:
充当空操作。
Nowadays (即:在现代环境中)您通常可以使用:
或者true
。true
更容易阅读。:
是一个所谓的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
,尽管这当然是特定于实现的细节。