【问题标题】:Bash Script : what does #!/bin/bash mean? [duplicate]Bash 脚本:#!/bin/bash 是什么意思? [复制]
【发布时间】:2012-12-14 03:03:29
【问题描述】:

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

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

【问题讨论】:

    标签: bash


    【解决方案1】:

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

    在您的示例中,脚本将由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 )

    【讨论】:

    • 谢谢!但是#!/bin/bash#!/bin/sh 之间有区别吗?
    • @ShivanRaptor #!/bin/bash 表示在 bash 中运行此脚本。 #!/bin/sh 表示在 sh 中运行此脚本,这是默认的 unix shell,可能是 bash 或任何其他变体,如 ksh、dash、zsh 等
    • bashsh 运行时,它的行为与以bash 运行时不同(更像POSIX)。阅读手册;它确实涵盖了这个细节。
    • @KarthikT 它不运行默认 shell,它在 Bourne Shell 模式下运行 bash。 (相对于 Bourne Again Shell,又名 bash)在一些较旧的系统上,它会运行 Bourne Shell 本身。
    • 哇,这真是太棒了,谢谢@gniourf_gniourf!
    【解决方案2】:

    在 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 脚本。

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

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

    【讨论】:

      【解决方案3】:

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

      话虽如此,#!/bin/bash#!/bin/sh 甚至#!/bin/zsh 之间的区别在于是否使用 bash、sh 或 zsh 程序来解释文件的其余部分。 bashsh 传统上只是不同的程序。在某些 Linux 系统上,它们是同一程序的两个副本。在其他 Linux 系统上,sh 是指向dash 的链接,而在传统的 Unix 系统(Solaris、Irix 等)上,bash 通常是与sh 完全不同的程序。

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

      【讨论】:

      • sh 通常是 bash 运行兼容模式,自从 bash 成为大多数 Linux 发行版的默认 shell 和 IIRC 在此之前的好几年里,这是正确的,可以肯定地说它是已经 15 年,可能超过 20 年。
      • 在我的 Debian 和 Ubuntu 系统上,/bin/sh 是破折号。 Android 表示它使用ash 作为/bin/sh
      • @JoshuaDBoyd 不错,许多(尽管可能不是全部)BSD unix 使用 Ash 作为默认 shell,而不是 Bash,而 Debian / Ubuntu 使用 Dash。与 Bash 类似,Ash 和 Dash 都具有 sh 兼容模式。如果我们深入研究 Solaris、Aix、HPUX、Ultrix、SCO 等,每个都有自己的默认 shell,它们将具有 sh 仿真(以保持 POSIX 兼容。)
      猜你喜欢
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多