#!magic, details about the shebang/hash-bang mechanism on various Unix flavours
6 months ago
- #Unix
- #ShellScripting
- #History
- #!(shebang)机制在Unix第7版和第8版之间引入,最初在4.0BSD(约1980年10月)实现但默认未启用
- 早期实现存在限制:行长度限制为16或32字节,且无法传递参数
- 该机制后来在4.2BSD(约1983年9月)默认启用,将所有#!参数作为单个字符串传递
- 2.8BSD(约1981年7月)也添加了#!但默认不激活,其代码与4BSD略有不同
- 由于许可证问题,4.3BSD Net/2移除了#!机制,后续系统如NetBSD/386BSD/BSDI不得不重新实现
- Linux在0.09或0.10内核版本引入#!,最初最大长度1022字节,后缩减至127字节
- 不同Unix系统处理#!行的方式各异:有的将所有参数合并传递,有的拆分传递,有的仅传递首个参数
- 常配合env(1)使用#!以从PATH启动解释器,但env路径因系统而异会影响可移植性
- 脚本的Setuid支持在4.3BSD-Tahoe被禁用且未出现在4.4BSD;后续系统如NetBSD/Linux在特定条件下实现
- 术语'shebang'可能源自'sharp-bang'或'shell bang'的缩写,并受美国俚语'the whole shebang'影响