【发布时间】:2012-02-05 07:47:57
【问题描述】:
“#!/bin/sh”在 shell 脚本中的用途/含义是什么?请让我知道它是否在脚本中被考虑。
【问题讨论】:
“#!/bin/sh”在 shell 脚本中的用途/含义是什么?请让我知道它是否在脚本中被考虑。
【问题讨论】:
脚本开头的 sha-bang (#!) [1] 告诉您的系统该文件是一组命令,将被提供给指定的命令解释器。这 #!实际上是一个两字节的 [2] 幻数,一个指定文件类型的特殊标记,或者在这种情况下是一个可执行的 shell 脚本(键入 man magic 以获取有关这个迷人主题的更多详细信息)。紧跟在 sha-bang 后面的是路径名。这是解释脚本中命令的程序的路径,无论它是 shell、编程语言还是实用程序。然后,此命令解释器执行脚本中的命令,从顶部(sha-bang 行之后的行)开始,并忽略 cmets。 [3]
【讨论】:
脚本可以在第一行指定 #!/bin/bash,这意味着脚本应该始终使用 bash 运行,而不是使用另一个 shell。 /bin/sh 是代表系统外壳的可执行文件。实际上,它通常被实现为一个符号链接,指向系统 shell 的可执行文件
【讨论】:
是shell可执行文件所在的路径。
【讨论】:
它被操作系统用于设置了执行位的常规文件。如果文件未被识别为“纯”二进制格式(即 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 脚本等等。事实上,对于您选择的任何解释器。
【讨论】:
这意味着您的脚本在直接执行时将以兼容模式 (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。
【讨论】:
/bin/sh 实际上不是 POSIX 兼容系统中的 Bourne-sh shell,它的意思是“任何 POSIX 兼容 shell”,它是规范的一部分,当你使用它时您表示您正在编写 POSIX-sh 代码,而不管使用何种外壳,因为在 bash 的情况下它以兼容模式运行(其他外壳可能表现不同,但唯一能保证 shebang 是您拥有并执行 POSIX) .
/bin/sh 具有某种魔力,并且无论/bin/sh 链接到何处,内核都会运行与 bourne 兼容的 shell。否:如果 /bin/sh 符号链接到 bash,那么它 is 运行 bash,但 bash 发现它是以 sh 的名义调用的,因此以兼容模式运行,它的作用类似于历史/POSIX sh。
/bin/sh 是文件系统的一个元素,就像任何其他元素一样,但这并不一定意味着它是任何 shell,特别并不意味着它必须是 Bourne-sh,它可能是,也可能是其他东西(它甚至可能不存在),因此除了 POSIX-sh 功能之外,你不能假设任何关于它的东西,并且只有当你处于 POSIX 兼容环境中时,因为 POSIX 需要它。跨度>