bash shebang 的作用是什么?

bash shebang 的作用是什么?
  • 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(通过exechashbang 行)还是bash script(手动运行 bash 解释器)启动:

#!/bin/bash -u
echo $1

答案3

bashshebang 行本身没有任何意义,它只将其视为注释。当 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”:)

相关内容