一个本身几乎只相当于注释引导符,但却是一个独立的 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 "条件为真"
fifalse 的实现:非 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 等效,但效率更高。