【问题标题】:What is the use/meaning of "#!/bin/sh" in shell scripting?shell脚本中“#!/bin/sh”的用途/含义是什么?
【发布时间】:2012-02-05 07:47:57
【问题描述】:

“#!/bin/sh”在 shell 脚本中的用途/含义是什么?请让我知道它是否在脚本中被考虑。

【问题讨论】:

标签: shell unix


【解决方案1】:

脚本开头的 sha-bang (#!) [1] 告诉您的系统该文件是一组命令,将被提供给指定的命令解释器。这 #!实际上是一个两字节的 [2] 幻数,一个指定文件类型的特殊标记,或者在这种情况下是一个可执行的 shell 脚本(键入 man magic 以获取有关这个迷人主题的更多详细信息)。紧跟在 sha-bang 后面的是路径名。这是解释脚本中命令的程序的路径,无论它是 shell、编程语言还是实用程序。然后,此命令解释器执行脚本中的命令,从顶部(sha-bang 行之后的行)开始,并忽略 cmets。 [3]

来源:http://tldp.org/LDP/abs/html/sha-bang.html#MAGNUMREF

【讨论】:

    【解决方案2】:

    脚本可以在第一行指定 #!/bin/bash,这意味着脚本应该始终使用 bash 运行,而不是使用另一个 shell。 /bin/sh 是代表系统外壳的可执行文件。实际上,它通常被实现为一个符号链接,指向系统 shell 的可执行文件

    【讨论】:

      【解决方案3】:

      是shell可执行文件所在的路径。

      【讨论】:

        【解决方案4】:

        它被操作系统用于设置了执行位的常规文件。如果文件未被识别为“纯”二进制格式(即 ELF 或 DWARF 或其他),操作系统会尝试读取 #!/path/to/interpreter -plus -options 并进行转换:

        myscript myargument
        

        进入:

        /path/to/interpreter -plus -options myscript myargument
        

        它还安排 argc 和 argv 是正确的(即,argv[0] 将是您的脚本名称,而 argv[1] 是选项 1 等)。

        这也适用于 perl 脚本、python 脚本等等。事实上,对于您选择的任何解释器。

        【讨论】:

          【解决方案5】:

          这意味着您的脚本在直接执行时将以兼容模式 (POSIX) 运行 (even if /bin/sh is an alias to bash)


          反对者的引用:

          Bourne shell 或 sh 是 Unix 版本 7 的默认 Unix shell,并且大多数类 Unix 系统继续具有 /bin/sh - 这将是 Bourne shell,或者是到兼容的符号链接或硬链接shell - 即使大多数用户使用更现代的 shell。

          http://en.wikipedia.org/wiki//bin/sh

          和:

          使用 Bash 特定功能(bashisms)编写的 Shell 脚本将无法在使用 Bourne shell 或其替代品之一的系统上运行,除非还安装了 Bash 并且脚本以 #!/bin 的“shebang 行”开头/bash 解释器指令而不是 #!/bin/sh。

          http://en.wikipedia.org/wiki/Bash_(Unix_shell)#Portability

          【讨论】:

          • 这与兼容模式无关。这是一个 bash 功能,而不是 #!一般
          • 你错了,/bin/sh 实际上不是 POSIX 兼容系统中的 Bourne-sh shell,它的意思是“任何 POSIX 兼容 shell”,它是规范的一部分,当你使用它时您表示您正在编写 POSIX-sh 代码,而不管使用何种外壳,因为在 bash 的情况下它以兼容模式运行(其他外壳可能表现不同,但唯一能保证 shebang 是您拥有并执行 POSIX) .
          • 您提供了两个引号,均未引用 POSIX 标准。第一个链接只是说 Bash 在通过 #!/bin/sh 使用时变得与 POSIX 兼容。所以我会声称它仍然是您所描述的 bash 功能,而不是关于 #!/bin/sh
          • 萨姆斯的回答是正确的,但可能不是他或她认为的原因。答案的编写方式表明,/bin/sh 具有某种魔力,并且无论/bin/sh 链接到何处,内核都会运行与 bourne 兼容的 shell。否:如果 /bin/sh 符号链接到 bash,那么它 is 运行 bash,但 bash 发现它是以 sh 的名义调用的,因此以兼容模式运行,它的作用类似于历史/POSIX sh。
          • 好的,是的,/bin/sh 是文件系统的一个元素,就像任何其他元素一样,但这并不一定意味着它是任何 shell,特别并不意味着它必须是 Bourne-sh,它可能是,也可能是其他东西(它甚至可能不存在),因此除了 POSIX-sh 功能之外,你不能假设任何关于它的东西,并且只有当你处于 POSIX 兼容环境中时,因为 POSIX 需要它。跨度>
          猜你喜欢
          • 2011-11-14
          • 2012-02-24
          • 2012-05-22
          • 1970-01-01
          • 2013-01-29
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 2017-03-18
          相关资源
          最近更新 更多