144

在 bash 脚本中,#!/bin/bash第一行是什么意思?

更新#!/bin/bash:和之间有区别#!/bin/sh吗?

4

3 回答 3

182

这称为shebang,它告诉 shell 在执行时用什么程序解释脚本。

在您的示例中,脚本将由bash shell 解释和运行。

其他一些示例 shebangs 是:

(来自维基百科)

#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell
#!/bin/csh — Execute the file using csh, the C shell, or a compatible shell
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks
#!/usr/bin/php — Execute the file using the PHP command line interpreter
#!/usr/bin/python -O — Execute using Python with optimizations to code
#!/usr/bin/ruby — Execute using Ruby

还有一些我能想到的其他问题,例如:

#!/bin/ksh
#!/bin/awk
#!/bin/expect

例如,在带有 bash shebang 的脚本中,您将使用 bash 语法编写代码;而在带有期望 shebang 的脚本中,您将使用期望语法对其进行编码,依此类推。

对更新部分的回应:

这取决于/bin/sh您系统上实际指向的内容。通常它只是一个符号链接到/bin/bash. 有时编写可移植脚本#!/bin/sh只是为了表示它是一个 shell 脚本,但它使用/bin/sh该特定系统上引用的任何 shell(可能指向/bin/bash,/bin/ksh/bin/zsh

于 2012-12-14T03:04:29.923 回答
19

在 bash 脚本中,第一行的 #!/bin/bash 是什么意思?

在 Linux 系统中,我们有解释 UNIX 命令的 shell。现在Unix系统中有许多shell。其中,有一个叫bash的shell,在Linux中很常见,历史也很悠久。这是 Linux 中的默认 shell。

当您编写脚本(unix 命令的集合等)时,您可以选择指定可以使用哪个 shell。通常,您可以使用Shebang指定它的外壳(是的,这就是它的名称)。

因此,如果您 #!/bin/bash 在脚本的顶部,那么您就是在告诉您的系统使用 bash 作为默认 shell。

现在来到你的第二个问题:#!/bin/bash 和 #!/bin/sh 之间有区别吗?

答案是肯定的。当您告诉 #!/bin/bash 时,您就是在告诉您的环境/操作系统使用 bash 作为命令解释器。这是硬编码的东西。

每个系统都有自己的 shell,系统将使用它来执行自己的系统脚本。该系统 shell 可能因操作系统而异(大多数情况下它将是 bash。Ubuntu 最近使用dash作为默认系统 shell)。当您指定 #!/bin/sh 时,系统将使用它的内部系统 shell 来解释您的 shell 脚本。

访问此链接以获取更多信息,我已在其中解释了该主题。

希望这会消除你的困惑......祝你好运。

于 2013-11-09T11:29:51.053 回答
16

当脚本中的第一个字符是#!时,称为shebang。如果您的文件以 #!/path/to/something标准开头,则运行something并将文件的其余部分作为输入传递给该程序。

#!/bin/bash话虽如此,#!/bin/sh、 甚至之间的区别在于#!/bin/zshbash、sh 或 zsh 程序是否用于解释文件的其余部分。 bash并且sh只是不同的程序,传统上。在某些 Linux 系统上,它们是同一程序的两个副本。在其他 Linux 系统上,sh是.dashbashsh

当然,该行的其余部分不必以 sh 结尾。也可以是#!/usr/bin/python, #!/usr/bin/perl, 甚至#!/usr/local/bin/my_own_scripting_language.

于 2012-12-14T03:21:09.670 回答