一个脚本的第一行可能会指定 #!/bin/bash,意味着该脚本应始终使用 bash 运行,而不是其他 shell。/bin/sh 是代表系统 shell 的可执行文件。实际上,它通常被实现为符号链接,指向系统 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脚本以及诸如此类的脚本也适用。实际上,适用于您选择的任何解释器。
这意味着当直接执行时(即使/bin/sh
是bash的别名),你的脚本会以兼容模式(POSIX)运行。
针对那些给出负评的人,以下是引用:
Bourne shell(或称 sh)是 Unix Version 7 的默认 Unix shell,并且大多数类 Unix 系统仍然拥有 /bin/sh - 它将是 Bourne shell,或者是符号链接或硬链接到兼容 shell 的 Bourne shell - 即使在大多数用户使用更现代的 shell 的情况下。
http://en.wikipedia.org/wiki//bin/sh
并且:
使用Bash特定功能(bashisms)编写的Shell脚本将无法在使用Bourne shell或其替代品的系统上运行,除非安装了Bash并且脚本以“shebang line”开头,指定解释器为#!/bin/bash,而不是#!/bin/sh。
/bin/sh
在符合 POSIX 标准的系统中实际上并不是 Bourne-sh shell,它意味着“任何符合 POSIX 标准的 shell”,并且它是规范的一部分。当你使用它时,你表明你正在编写符合 POSIX 标准的 sh 代码,而不管使用的是哪个 shell,因为在 bash 的情况下,它以兼容模式运行(其他 shell 可能会有不同的行为,但这个 shebang 的唯一保证是你已经并且正在使用 POSIX)。 - Samus_/bin/sh
是某种神奇的东西,并且会导致内核运行一个兼容bourne shell的程序,而与/bin/sh
链接到哪里无关。不是这样的:如果/bin/sh
被符号链接到bash,则运行的就是bash,但bash会发现它是在sh
的名称下被调用的,并因此以兼容模式运行,在这种模式下,它的行为类似于历史/POSIX sh
。 - Norman Gray/bin/sh
就像任何其他文件系统元素一样,但这并不意味着它是特定的 shell,特别是不必是 Bourne-sh,它可能是或可能是其他东西(甚至可能不存在),因此您不能假设任何关于它的事情,除了 POSIX-sh 特性,而且只有在 POSIX 兼容环境中才能使用,因为 POSIX 要求如此。 - Samus_