<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Shebang</id>
	<title>Shebang - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Shebang"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Shebang&amp;action=history"/>
	<updated>2026-07-17T13:11:59Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Shebang&amp;diff=783090&amp;oldid=prev</id>
		<title>imported&gt;AromaTake：​/* top */ 調整內部連結。Fragment identifier(分段标识符)=&gt;URI片段#W3C提案</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Shebang&amp;diff=783090&amp;oldid=prev"/>
		<updated>2024-12-12T09:29:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;top：​&lt;/span&gt; 調整內部連結。Fragment identifier(分段标识符)=&amp;gt;&lt;a href=&quot;/wiki/URI%E7%89%87%E6%AE%B5#W3C提案&quot; title=&quot;URI片段&quot;&gt;URI片段#W3C提案&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{noteTA&lt;br /&gt;
|G1=IT&lt;br /&gt;
|1=zh-hant:驚嘆號; zh-hans:叹号;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
在[[计算]]领域中，&amp;#039;&amp;#039;&amp;#039;Shebang&amp;#039;&amp;#039;&amp;#039;（也称为&amp;#039;&amp;#039;&amp;#039;Hashbang&amp;#039;&amp;#039;&amp;#039;）是一个由[[井号]]和[[叹号]]构成的字符序列&amp;#039;&amp;#039;&amp;lt;code&amp;gt;#!&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;，其出现在文本文件的第一行的前两个字符。&lt;br /&gt;
在文件中存在Shebang的情况下，[[类Unix操作系统|类Unix操作系统]]的[[載入器]]会分析Shebang后的内容，将这些内容作为解释器指令，并调用该指令，并将载有Shebang的文件路径作为该解释器的参数&amp;lt;ref name=&amp;quot;absg_shabang&amp;quot;&amp;gt;{{cite web|title=Advanced Bash Scripting Guide: Chapter 2. Starting Off With a Sha-Bang|url=http://tldp.org/LDP/abs/html/sha-bang.html|accessdate=2019-12-10|dead-url=no|archive-url=https://web.archive.org/web/20191210080709/http://tldp.org/LDP/abs/html/sha-bang.html|archive-date=2019-12-10}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web|title=execve(2) - Linux man page|url=http://linux.die.net/man/2/execve|accessdate=2010-10-21|archive-date=2010-11-02|archive-url=https://web.archive.org/web/20101102030248/http://linux.die.net/man/2/execve|dead-url=no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
例如，以指令{{code|#!/bin/sh}}开头的文件在执行时会实际调用&amp;#039;&amp;#039;/bin/sh&amp;#039;&amp;#039;程序（通常是[[Bourne shell]]或兼容的[[Unix shell|shell]]，例如[[bash]]、[[Debian_Almquist_shell|dash]]等）来执行。这行内容也是[[shell脚本]]的标准起始行。&lt;br /&gt;
&lt;br /&gt;
由于&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;符号在许多[[脚本语言]]中都是注释标识符，Shebang的内容会被这些脚本解释器自动忽略。&lt;br /&gt;
在&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;字符不是注释标识符的语言中，例如[[Scheme]]，解释器也可能忽略以&amp;lt;code&amp;gt;#!&amp;lt;/code&amp;gt;开头的首行内容，以提供与Shebang的兼容性&amp;lt;ref&amp;gt;{{cite web|url=http://srfi.schemers.org/srfi-22/|title=SRFI 22: Running Scheme Scripts on Unix|author=Martin Gasbichler and Michael Sperber|accessdate=2011-03-19|archive-date=2011-02-27|archive-url=https://web.archive.org/web/20110227192431/http://srfi.schemers.org/srfi-22/|dead-url=no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Shebang&amp;quot;或者说&amp;quot;Hashbang&amp;quot;的名字有时也被当做[[Ajax]]应用程序中的[[URI片段#W3C提案|分段标识符]]，用于浏览器的状态保存；Google网站站长中心提到，以[[叹号]]开头的分段标识符（即...url#!state...）会为Google的网页爬虫所索引。&lt;br /&gt;
&lt;br /&gt;
== 语法 ==&lt;br /&gt;
Shebang这一语法特性由&amp;lt;code&amp;gt;#!&amp;lt;/code&amp;gt;开头，即[[井号]]和[[叹号]]。&lt;br /&gt;
在开头字符之后，可以有一个或数个空白字符，后接解释器的[[路径 (计算机科学)#绝对与相对路径|绝对路径]]，用于调用解释器。&lt;br /&gt;
在直接调用脚本时，调用者会利用Shebang提供的信息调用相应的解释器，从而使得脚本文件的调用方式与普通的可执行文件类似。&lt;br /&gt;
&lt;br /&gt;
== 词源与历史 ==&lt;br /&gt;
Shebang的名字来自于[[升音符|SHArp]]和[[叹号|bang]]，或&amp;#039;&amp;#039;haSH bang&amp;#039;&amp;#039;的[[缩写]]，指代Shebang中&amp;lt;code&amp;gt;#!&amp;lt;/code&amp;gt;两个符号的典型Unix名称。&lt;br /&gt;
Unix术语中，井号通常称为&amp;#039;&amp;#039;sharp&amp;#039;&amp;#039;，&amp;#039;&amp;#039;hash&amp;#039;&amp;#039;或&amp;#039;&amp;#039;mesh&amp;#039;&amp;#039;；而叹号则常常称为&amp;#039;&amp;#039;bang&amp;#039;&amp;#039;。也有看法认为，shebang名字中的&amp;#039;&amp;#039;sh&amp;#039;&amp;#039;来自于默认[[Unix shell|shell]]————[[Bourne shell]]的名称，&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;，因为常常使用shebang调用之。&amp;lt;ref&amp;gt;{{cite web |url=http://catb.org/jargon/html/S/shebang.html |title=Jargon File entry for shebang |publisher=Catb.org |date= |accessdate=2010-06-16 |archive-date=2011-06-04 |archive-url=https://web.archive.org/web/20110604153025/http://catb.org/jargon/html/S/shebang.html |dead-url=no }}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;absg_shabang&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在2010年版的[http://tldp.org/LDP/abs/html/ Advanced bash scripting guide]{{Wayback|url=http://tldp.org/LDP/abs/html/ |date=20110408201305 }}（revision 6.2）中，shebang被称为&amp;quot;sha-bang&amp;quot;，同时提到&amp;quot;也写作she-bang或sh-bang&amp;quot;，但该文件中没有提到&amp;quot;shebang&amp;quot;这一形式。&amp;lt;ref name=&amp;quot;absg_shabang&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[丹尼斯·里奇]]在被问及他会如何称呼这一特性时，他答道：&lt;br /&gt;
&lt;br /&gt;
{{quote|发信人：&amp;quot;Ritchie, Dennis M (Dennis)** CTR **&amp;quot; &amp;lt;dmr@[redacted]&amp;gt;&lt;br /&gt;
&lt;br /&gt;
收信人：&amp;lt;[redacted]@talisman.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
日期：Thu, 19 Nov 2009 18:37:37 -0600&lt;br /&gt;
&lt;br /&gt;
主题：RE: What do -you- call your #!&amp;lt;something&amp;gt; line?&lt;br /&gt;
&lt;br /&gt;
我不记得我们曾经给它取过一个适当的名字。导入这一特性已经是相当晚了--我觉得我是从关于伯克利Unix的UCB会议上的某人那里得到的这一灵感；我可能是首先实现它的人之一，但这个创意是来自于别人的。&lt;br /&gt;
&lt;br /&gt;
至于它的名字：可能是类似于&amp;quot;hash-bang&amp;quot;的英国风描述性文字，但我没有在任何场合使用类似宠物的名字来描述它。&lt;br /&gt;
&lt;br /&gt;
此致,&lt;br /&gt;
&lt;br /&gt;
Dennis&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 例子 ==&lt;br /&gt;
下面列出了一些典型的 shebang 解释器指令：&lt;br /&gt;
* &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt;—使用&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;，即[[Bourne shell]]或其它兼容shell执行脚本&lt;br /&gt;
* &amp;lt;code&amp;gt;#!/bin/csh&amp;lt;/code&amp;gt;—使用&amp;lt;code&amp;gt;csh&amp;lt;/code&amp;gt;，即[[C shell]]执行&lt;br /&gt;
* &amp;lt;code&amp;gt;#!/usr/bin/perl -w&amp;lt;/code&amp;gt;—使用带警告的[[Perl]]执行&lt;br /&gt;
* &amp;lt;code&amp;gt;#!/usr/bin/python -O&amp;lt;/code&amp;gt;—使用具有代码优化的[[Python]]执行&lt;br /&gt;
* &amp;lt;code&amp;gt;#!/usr/bin/php&amp;lt;/code&amp;gt;—使用[[PHP]]的命令行解释器执行&lt;br /&gt;
&lt;br /&gt;
在许多系统上，&amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;[[软链接]]或[[硬链接]]到[[Bash]]，而&amp;lt;code&amp;gt;/bin/csh&amp;lt;/code&amp;gt;则链接到[[tcsh]]，因此设定前面的解释器实际上是运行的与之兼容的，或改进的版本。&lt;br /&gt;
&lt;br /&gt;
Shebang行也可以包含需要传递到解释器的特定选项（见下文的Perl例子）。然而，选项传递的方式随实现的不同而不同。&lt;br /&gt;
&lt;br /&gt;
== 用途 ==&lt;br /&gt;
解释器指令允许脚本和数据文件充当系统命令，无需在调用时由用户指定解释器，从而对用户和其它程序隐藏其实现细节。&lt;br /&gt;
&lt;br /&gt;
假设&amp;lt;code&amp;gt;/usr/local/bin/foo&amp;lt;/code&amp;gt;中有一以下行开头的[[Bourne shell]]脚本&lt;br /&gt;
&amp;lt;code&amp;gt;#!/bin/sh -x&amp;lt;/code&amp;gt;&lt;br /&gt;
而它被如此调用（&amp;quot;$&amp;quot;是命令提示符）&lt;br /&gt;
$ &amp;lt;code&amp;gt;foo bar&amp;lt;/code&amp;gt;&lt;br /&gt;
该命令的输出等同于&lt;br /&gt;
$ &amp;lt;code&amp;gt;/bin/sh -x /usr/local/bin/foo bar&amp;lt;/code&amp;gt;&lt;br /&gt;
除了argv[0]被设定为脚本的文件名，而非解释器的文件名外。&lt;br /&gt;
&lt;br /&gt;
由于&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;从其命令行指定的文件中读取命令，上面的命令就会执行&amp;lt;code&amp;gt;/usr/local/bin/foo&amp;lt;/code&amp;gt;中的命令，同时，将&amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt;作为&amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt;命令的参数&amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
由于shebang开头的井号也是[[Bourne shell]]和许多其它解释性语言的注释符，因此在这些语言中，解释器指令本身会被解释器认为是单纯的注释而跳过。&lt;br /&gt;
然而，并不是每一种解释器都会自动忽略shebang行，例如对于下面的脚本，&amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;会把文件中的两行都输出到[[标准输出]]中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line=&amp;quot;1o&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#!/bin/cat&lt;br /&gt;
Hello world!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用&amp;lt;code&amp;gt;#!/usr/bin/env 脚本解释器名称&amp;lt;/code&amp;gt;是一种常见的在不同平台上都能正确找到解释器的办法。&lt;br /&gt;
&lt;br /&gt;
Linux的操作系统的文件一般是UTF-8编码。如果脚本文件是以UTF-8的&amp;lt;code&amp;gt;[[字节顺序标记|BOM]]（0xEF 0xBB 0xBF）&amp;lt;/code&amp;gt;开头的，那么exec函数将不会启动shebang指定的解释器来执行该脚本。因此，Linux的脚本文件不应在文件开头包含UTF-8的[[字节顺序标记|BOM]]。&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
*[[CrunchBang Linux]]，一种GNU/Linux发行版&lt;br /&gt;
*[[文件关联]]&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
*[http://www.in-ulm.de/~mascheck/various/shebang/ Details about the shebang mechanism on various Unix flavours]{{Wayback|url=http://www.in-ulm.de/~mascheck/various/shebang/ |date=20110525021314 }}&lt;br /&gt;
*[http://homepages.cwi.nl/~aeb/std/hashexclam.html #! - the Unix truth as far as I know it]{{Wayback|url=http://homepages.cwi.nl/~aeb/std/hashexclam.html |date=20110605012903 }}（a more generic approach）&lt;br /&gt;
*[http://foldoc.org/index.cgi?query=shebang&amp;amp;action=Search FOLDOC shebang article]&lt;br /&gt;
&lt;br /&gt;
[[Category:Unix]]&lt;/div&gt;</summary>
		<author><name>imported&gt;AromaTake</name></author>
	</entry>
</feed>