- bash shebang 的作用是什么?
./file
使用或执行文件有什么区别sh file
?- bash 是怎么理解的呢?
答案1
- shebang的作用是:
解释器指令允许将脚本和数据文件用作命令,从而无需在命令行上为其解释器添加脚本前缀,从而对用户和其他程序隐藏其实现的细节。
- 使用 ./file 或 sh 文件执行文件有什么不同?
由路径 some/path/to/foo 标识的 Bourne shell 脚本具有初始行,
#!/bin/sh -x
并使用参数 bar 和 baz 执行
some/path/to/foo bar baz
提供与实际执行以下命令行类似的结果:
/bin/sh -x some/path/to/foo bar baz
注意:1980 年 Dennis Ritchie 引入了对解释器指令的内核支持:
The system has been changed so that if a file being executed begins with the magic characters #! , the rest of the line is understood to be the name of an interpreter for the executed file. Previously (and in fact still) the shell did much of this job; it automatically executed itself on a text file with executable mode when the text file's name was typed as a command. Putting the facility into the system gives the following benefits. 1) It makes shell scripts more like real executable files, because they can be the subject of 'exec.' 2) If you do a 'ps' while such a command is running, its real name appears instead of 'sh'. Likewise, accounting is done on the basis of the real name. 3) Shell scripts can be set-user-ID.
注意:Linux 忽略所有解释的可执行文件(即以 #! 行开头的可执行文件)上的 setuid 位。
4) It is simpler to have alternate shells available; e.g. if you like the Berkeley csh there is no question about which shell is to interpret a file. 5) It will allow other interpreters to fit in more smoothly.
更多信息 :
答案2
hashbang 的功能是告诉核心执行文件时运行什么程序作为脚本解释器。
运行./program
正是这样做的,并且需要文件的执行权限,但不知道它是什么类型的程序。它可能是 bash 脚本、sh 脚本、Perl、Python、awk 或 Expect 脚本,或者实际的二进制可执行文件。运行sh program
将强制它在 下运行sh
,而不是在其他任何东西下运行。
请注意,sh
不同于bash
!后者具有许多标准 shell 所不知道的高级功能。根据系统的不同,sh
可能是另一个程序,或者是兼容模式下的 Bash,但结果通常是相同的:任何高级功能都无法访问。
Bash 本身并不理解 hashbang 行,而是依赖内核来读取它。另一方面,Perl 解释器也会自行读取 hashbang 行,无论它是如何启动的:它这样做是为了选择 hashbang 行上设置的任何命令行选项。 Bash 不这样做。
例如,以下脚本具有不同的行为,具体取决于它是作为./script
(通过exec
hashbang 行)还是bash script
(手动运行 bash 解释器)启动:
#!/bin/bash -u
echo $1
答案3
bash
shebang 行本身没有任何意义,它只将其视为注释。当 shell 读取命令行,并且该命令是外部程序(而不是像 之类的内部命令cd
)时,它会使用execve
系统调用来执行该命令。然后内核execve
通过检查传递给该文件的可执行文件类型来检查幻数在文件的开头。如果幻数由两个字节 0x23 0x21 (ASCII 字符#!
)组成,则内核假定它们后面跟着脚本解释器的绝对路径。然后内核启动解释器,将脚本传递给它。
答案4
嗯,百分百准确地说,“bash shebang”并没有太多内容。 Shebang 可以以各种形式弹出。这只是一个解释器指示。所以,比方说,一个shebang#!/usr/bin/perl
会f.ex。是一个“perl shebang”并指示 Perl 解释器作为此类脚本的解释器。然后您可以像调用任何 shell 脚本一样直接调用这样的 perl 脚本。这同样适用于任何其他脚本解释器。这可能是 php、cshell、prolog、basic 或任何其他以某种方式解释文本文件的程序。当然,该解释器应该能够忽略 shebang。对于 bash,它只是一个注释行。 php和perl也是如此。我认为 prolog 会因为那句话而窒息。 shebang 还应该与您自己的应用程序无缝协作,只要它能够解释文本并忽略 shebang。
如果 f.ex 会很有趣。 JavaScript 解释器将能够忽略这样的“Javascript shebang”:)