在UNIX shell脚本中,"#!/bin/sh"这一行是什么意思?

176

我正在学习一些shell脚本教程,并发现了以下示例程序:

#!/bin/sh
clear
echo "HELLO WORLD"

请问有人可以告诉我在开头的注释#!/bin/sh的重要性是什么吗?


3
Shebang是Unix和类Unix操作系统中的特殊字符序列,通常用于指定脚本文件的解释器。它由井号(#)和叹号(!)组成,紧随其后的是解释器的完整路径名。当在终端上执行脚本文件时,操作系统会读取Shebang行并使用指定的解释器来执行该脚本。 - drootang
3
在askubuntu上有一个很好的解释:http://askubuntu.com/questions/141928/what-is-difference-between-bin-sh-and-bin-bash - fkoessler
1
可能是为什么需要在脚本文件开头加上#!/bin/bash?的重复问题。 - the Tin Man
5个回答

175

这被称为shebang,并告诉父shell使用哪个解释器来执行脚本。

#!/bin/sh <--------- bourne shell compatible script
#!/usr/bin/perl  <-- perl script
#!/usr/bin/php  <--- php script
#!/bin/false <------ do-nothing script, because false returns immediately anyways.

大多数脚本语言往往将以#开头的行解释为注释,并会忽略后面的!/usr/bin/whatever部分,否则可能会在解释语言中导致语法错误。


10
通常是内核而不是shell来处理这个。Shell只需在文件上调用 exec() 系统调用。 - tripleee
#!/bin/sh <--------- bourne shell 兼容脚本我们不能确定它是 Bourne Shell,它可能是任何一种 shell,这取决于 /bin/sh 软链接通常指向的位置。例如,在最新的 Ubuntu 中,“sh” 默认指向“dash”。 - Thushi

53

当你尝试在Unix中运行一个程序(具有可执行位),操作系统会查看文件的前几个字节。这些字节构成了所谓的“魔数”,可以用来确定程序的格式以及如何执行它。

#!对应的魔数是0x2321(请在ASCII表中查找)。当系统看到该魔数时,它知道正在处理一个文本脚本,并读取到下一个\n(有一个限制,但我现在想不起来了)。通过识别解释器(shebang后面的第一个参数),它将调用解释器。

其他文件也有魔数。尝试使用less查看位图(.BMP)文件,您将看到前两个字符是BM。这个魔数表示该文件确实是一个位图。


15
如果包含该脚本的文件是可执行的,则哈希标识符(#!)告诉操作系统要使用哪个解释器来运行脚本。例如,此处使用的是/bin/sh
有一篇维基百科文章提供更多信息:Shebang (Unix)

8
第一行告诉shell,如果你直接执行脚本(./run.sh;而不是/bin/sh run.sh),它应该使用那个程序(在本例中为/bin/sh)来解释它。
您还可以使用它传递参数,通常是-e(错误时退出),或使用其他程序(/bin/awk,/usr/bin/perl等)。

-4

#!/bin/sh#!/bin/bash必须是脚本的第一行,因为如果你不在第一行使用它,系统将会把该脚本中所有命令都视为不同的命令。如果第一行是#!/bin/sh,则系统将会将所有的命令都视为一个脚本,并且在ps命令中显示该文件正在运行,而不是文件内部的命令。

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo

3
Stack Overflow不是Twitter。请花时间正确拼写单词,例如 "u" 和 "1st"。您正在帮助编写参考书,因此正确的语法和拼写非常重要。此外,请注意正确的格式化。应该格式化从命令行发出的命令,例如 ps,以及类似 #!/bin/sh 的代码摘录。 - the Tin Man
2
我试图清理这里的英语,但我仍然不确定它的意思。我猜答案试图说脚本中的命令将作为单独的命令执行,并添加shebang将在进程列表中显示脚本作为单个命令。这实际上并不是真的。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接