Hasty Briefsbeta

双语

#!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'影响