一个本身几乎只相当于注释引导符,但却是一个独立的 shell 内置命令的命令,它的作用是什么? 我能看到的唯一可能的原因是这些:
# 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
我想我真正想了解的是,它在历史上可能有什么用途。
历史上,Bourne shell 并没有将 true
和 false
作为内置命令。相反,true
被简单地别名为 :
,而 false
则被设置为类似于 let 0
的东西。
•Bourne Shell(sh) 由 Stephen Bourne 在 1977 年为 Unix Version 7 开发,是现代 Shell(如 Bash、Zsh)的鼻祖。•早期 Unix 系统的工具链较为精简,某些现代 Shell 的常见功能(如内置命令 true
/false
)在当时可能尚未标准化。
true
的实现:为何使用 :
•冒号命令 :
是 Bourne Shell 的内置命令,设计为一个“无操作”(no-op)占位符,语法上要求命令存在但无需执行任何操作。
示例:
while :; do
echo "无限循环"
done
•历史文档依据:
在 Unix Version 7 的 Bourne Shell 手册(1979 年)中,:
被明确描述为“返回 0 退出码的空命令”¹。而 true
和 false
并未作为内置命令提及。
•替代 true
的实践:
由于 :
返回 0(成功状态),早期脚本中常用 :
替代 true
。例如:
if :; then
echo "条件为真"
fi
false
的实现:非 let 0
,而是更简单的命令•false
的替代方案:
早期 Bourne Shell 中,false
通常通过返回非零退出码的命令实现,例如:
•! :
:利用逻辑非操作符 !
反转 :
的退出码(0→1)。•exit 1
:直接退出并返回 1。•false
作为外部命令:某些系统可能提供 /bin/false
(一个直接返回 1 的极简二进制程序)。
•关于 let 0
的问题:
let
命令是 Korn Shell(ksh)引入的算术扩展功能,Bourne Shell 原生并不支持。因此,false
通过 let 0
实现的说法不准确。
•描述 :
为内置命令,无操作且返回 0²。•未提及 true
或 false
作为内置命令。
•书中示例使用 :
作为占位符和条件判断的“真”值³。•未提到 true
/false
,进一步支持早期依赖 :
的实践。
/bin/sh
(1986)•源代码分析显示,true
和 false
仍为外部命令(如 /bin/true
),而非 Shell 内置⁴。
true
/false
成为了内置命令?随着 Shell 的发展,出于性能考虑(减少外部命令调用开销),现代 Shell(如 Bash、ksh)将 true
/false
作为内置命令。例如:
•Bash:true
和 false
是内置命令,行为与 :
和 return 1
等效,但效率更高。