前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >GNU Bash 内置命令 :(冒号)的作用是什么?

GNU Bash 内置命令 :(冒号)的作用是什么?

作者头像
程序熵
发布2025-02-04 21:24:55
发布2025-02-04 21:24:55
5200
代码可运行
举报
文章被收录于专栏:技术汇技术汇
运行总次数:0
代码可运行

问题

一个本身几乎只相当于注释引导符,但却是一个独立的 shell 内置命令的命令,它的作用是什么? 我能看到的唯一可能的原因是这些:

代码语言:javascript
代码运行次数:0
复制
# 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 并没有将 truefalse 作为内置命令。相反,true 被简单地别名为 :,而 false 则被设置为类似于 let 0 的东西。

1. Bourne Shell 的历史背景

Bourne Shell(sh) 由 Stephen Bourne 在 1977 年为 Unix Version 7 开发,是现代 Shell(如 Bash、Zsh)的鼻祖。•早期 Unix 系统的工具链较为精简,某些现代 Shell 的常见功能(如内置命令 true/false)在当时可能尚未标准化。

2. true 的实现:为何使用 :

冒号命令 : 是 Bourne Shell 的内置命令,设计为一个“无操作”(no-op)占位符,语法上要求命令存在但无需执行任何操作。 示例

代码语言:javascript
代码运行次数:0
复制
while :; do
    echo "无限循环"
done

历史文档依据: 在 Unix Version 7 的 Bourne Shell 手册(1979 年)中,: 被明确描述为“返回 0 退出码的空命令”¹。而 truefalse 并未作为内置命令提及。 •替代 true 的实践: 由于 : 返回 0(成功状态),早期脚本中常用 : 替代 true。例如:

代码语言:javascript
代码运行次数:0
复制
if :; then
   echo "条件为真"
fi

3. 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 实现的说法不准确。

4. 权威资料佐证

Unix Version 7 手册(1979)

•描述 : 为内置命令,无操作且返回 0²。•未提及 truefalse 作为内置命令。

《The Unix Programming Environment》(1984)

•书中示例使用 : 作为占位符和条件判断的“真”值³。•未提到 true/false,进一步支持早期依赖 : 的实践。

BSD 4.3 的 /bin/sh(1986)

•源代码分析显示,truefalse 仍为外部命令(如 /bin/true),而非 Shell 内置⁴。

5. 为何 true/false 成为了内置命令?

随着 Shell 的发展,出于性能考虑(减少外部命令调用开销),现代 Shell(如 Bash、ksh)将 true/false 作为内置命令。例如:

Bashtruefalse 是内置命令,行为与 :return 1 等效,但效率更高。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 回答
    • 1. Bourne Shell 的历史背景
    • 2. true 的实现:为何使用 :
    • 3. false 的实现:非 let 0,而是更简单的命令
    • 4. 权威资料佐证
      • Unix Version 7 手册(1979)
      • 《The Unix Programming Environment》(1984)
      • BSD 4.3 的 /bin/sh(1986)
    • 5. 为何 true/false 成为了内置命令?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档