为什么“ she-bang”以“#!”开头?


10

为什么“她爆炸”开始就有一个#!,像#!/bin/bash?我一直都接受这是怎么做的,但是背后有原因吗?

为什么要开始#; 通常不是评论吗?还是应该发表评论?


4
维基百科具有相当详细的历史#!(正如dmr所记得的…),其中包括为什么的解释#(是的,现有shell必须忽略该行)。
吉尔(Gilles)“所以,别再邪恶了”,

错过检查Wikipedia :)
Johan

1
我只是希望炮弹足够聪明,如果有的话可以剥离多余的CR / LF ...;)
Aaron D. Marasco

Answers:


16

通常,shebang仅指#!!通常称为“ bang”,并且看起来“ she”是对“ SHArp”或“ haSH”的破坏#)-整行称为shebang行

它确实以注释字符开头,以向后兼容不知道如何处理的内容。在!大概是刚刚从一个随机评论启动文件区分开来,使之与开头的文件# this is my script!不会尝试运行this is my script!解释


2
Bang !通常在其他上下文中用于指示要执行的命令。例如,在vim具有其他命令行的程序中,bang常常是转义符,使它们在系统外壳而不是其内部界面中运行命令。
卡勒布

4

要理解这一点,您必须意识到脚本的第一行实际上是被2个不同的程序读取了两次。第一次,内核打开文件并#!在第一行中查找该字符序列()。如果找到它,它将运行那里显示的shell程序,并将文件名作为参数传递。(例如,如果文件/home/me/foo以开头#!/bin/sh,则内核将运行/bin/sh /home/me/foo)。

接下来,shell(bin/sh或指定的任何解释器程序)读取文件。Shell对shebang行一无所知,但仍会读取第一行,因为它与文件中的任何其他行一样……它将全部读取。您不希望shell崩溃或以任何方式改变其行为...这样做的方法是使它视为注释,而忽略它。因此,以内核指令开头的最佳字符将是注释字符。


确实是内核做到了这一点,听起来好像是您正在使用的当前shell将解析shebang然后推送脚本
Johan

不,这是内核本身,无论是实时的还是实时的。即使您不使用外壳执行脚本,它也可以工作...除了外壳以外,还有其他执行文件的方法...例如,从C程序使用“ exec”系统调用
JoelFan

zh.wikipedia.org/wiki/Shebang_(Unix)#Magic_number“#!” ascii中的字节为0x23 0x21-当exec()看到这些字节时,其行为是将行的其余部分视为解释器的路径。
亚伦·麦克米林

1

它必须是注释,因为只有这样,它也可以运行诸如“ interpretername scriptname”之类的脚本。我不知道“!”的由来。


1
即使您只运行./scriptname,解释器仍然会看到she-bang行,因此仍然需要添加注释。
psusi 2011年

1
或更详细地说:shebang:“#!” 设计为解释器不可见-因此它必须以注释char'#'开头。而是由内核“ exec [lv] *”系统调用集“查看”(并解释)。
arielf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.