
_START_ARTICLE_
Shebang
_START_PARAGRAPH_
在计算领域中，Shebang（也称为Hashbang ）是一个由井号和叹号构成的字符序列#! ，其出现在文本文件的第一行的前两个字符。_NEWLINE_在文件中存在Shebang 的情况下，类 Unix 操作系统的程序加载器会分析Shebang 后的内容，将这些内容作为解释器指令，并调用该指令，并将载有Shebang 的文件路径作为该解释器的参数。_NEWLINE_例如，以指令#!/bin/sh开头的文件在执行时会实际调用/bin/sh程序（通常是Bourne shell 或兼容的shell，例如 bash、dash 等）来执行。这行内容也是shell 脚本的标准起始行。_NEWLINE_由于 # 符号在许多脚本语言中都是注释标识符，Shebang 的内容会被这些脚本解释器自动忽略。_NEWLINE_在 # 字符不是注释标识符的语言中，例如 Scheme，解释器也可能忽略以#! 开头的首行内容，以提供与Shebang 的兼容性。_NEWLINE_"Shebang" 或者说"Hashbang" 的名字有时也被当做Ajax 应用程序中的分段标识符，用于浏览器的状态保存；Google 网站站长中心提到，以叹号开头的分段标识符（即 ...url#!state... ）会为Google 的网页爬虫所索引。
_START_SECTION_
语法
_START_PARAGRAPH_
Shebang 这一语法特性由#! 开头，即井号和叹号。_NEWLINE_在开头字符之后，可以有一个或数个空白字符，后接解释器的绝对路径，用于调用解释器。_NEWLINE_在直接调用脚本时，调用者会利用Shebang 提供的信息调用相应的解释器，从而使得脚本文件的调用方式与普通的可执行文件类似。
_START_SECTION_
词源与历史
_START_PARAGRAPH_
Shebang 的名字来自于SHArp 和 bang，或 haSH bang 的缩写，指代Shebang 中 #! 两个符号的典型Unix 名称。_NEWLINE_Unix 术语中，井号通常称为sharp，hash 或 mesh；而叹号则常常称为bang。也有看法认为，shebang 名字中的sh 来自于默认shell Bourne shell 的名称，sh，因为常常使用shebang 调用之。_NEWLINE_在2010年版的Advanced bash scripting guide（revision 6.2）中，shebang 被称为"sha-bang"，同时提到"也写作she-bang 或 sh-bang"，但该文件中没有提到"shebang" 这一形式。_NEWLINE_丹尼斯·里奇在被问及他会如何称呼这一特性时，他答道：_NEWLINE_发信人："Ritchie, Dennis M (Dennis)** CTR **" <dmr@[redacted]>_NEWLINE_收信人：<[redacted]@talisman.org>_NEWLINE_日期：Thu, 19 Nov 2009 18:37:37 -0600_NEWLINE_主题：RE: What do -you- call your #!<something> line?_NEWLINE_我不记得我们曾经给它取过一个适当的名字。导入这一特性已经是相当晚了--我觉得我是从关于伯克利Unix的UCB会议上的某人那里得到的这一灵感；我可能是首先实现它的人之一，但这个创意是来自于别人的。_NEWLINE_至于它的名字：可能是类似于"hash-bang"的英国风描述性文字，但我没有在任何场合使用类似宠物的名字来描述它。_NEWLINE_此致,_NEWLINE_Dennis
_START_SECTION_
用途
_START_PARAGRAPH_
解释器指令允许脚本和数据文件充当系统命令，无需在调用时由用户指定解释器，从而对用户和其它程序隐藏其实现细节。_NEWLINE_假设 /usr/local/bin/foo 中有一以下行开头的Bourne shell 脚本_NEWLINE_#!/bin/sh -x_NEWLINE_而它被如此调用（"$"是命令提示符）_NEWLINE_$ foo bar_NEWLINE_该命令的输出等同于_NEWLINE_$ /bin/sh -x /usr/local/bin/foo bar_NEWLINE_除了 argv[0] 被设定为脚本的文件名，而非解释器的文件名外。_NEWLINE_由于 sh 从其命令行指定的文件中读取命令，上面的命令就会执行/usr/local/bin/foo 中的命令，同时，将 bar作为foo 命令的参数$1。_NEWLINE_由于shebang开头的井号也是Bourne shell和许多其它解释性语言的注释符，因此在这些语言中，解释器指令本身会被解释器认为是单纯的注释而跳过。_NEWLINE_然而，并不是每一种解释器都会自动忽略shebang行，例如对于下面的脚本，_NEWLINE_#!/bin/cat_NEWLINE_Hello world!_NEWLINE_cat 会把文件中的两行都输出到标准输出中。_NEWLINE_使用 #!/usr/bin/env 脚本解释器名称 是一种常见的在不同平台上都能正确找到解释器的办法。_NEWLINE_Linux的操作系统的文件一般是UTF-8编码。如果脚本文件是以UTF-8 的 BOM（0xEF 0xBB 0xBF） 开头的，那么 exec 函数将不会启动shebang 指定的解释器来执行该脚本。因此，Linux 的脚本文件不应在文件开头包含UTF-8 的 BOM。