161

我正在浏览一些 shell 脚本教程,并找到了以下示例程序:

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

谁能告诉我#!/bin/sh一开始评论的意义是什么?

4

5 回答 5

160

它被称为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部分,否则可能会导致解释语言中的语法错误。

于 2011-09-09T19:57:09.153 回答
51

当您尝试在 unix 中执行程序(设置了可执行位的程序)时,操作系统将查看文件的前几个字节。这些形成了所谓的“幻数”,可以用来决定程序的格式以及如何执行它。

#!对应于幻数 0x2321(在 ascii 表中查找)。当系统看到这个幻数时,它知道它正在处理一个文本脚本并读取直到下一个\n(有一个限制,但它逃脱了我的 atm)。在确定了解释器(shebang 之后的第一个参数)之后,它将调用解释器。

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

于 2011-09-10T15:59:50.110 回答
13

如果该脚本所在的文件是可执行的,则 hash-bang ( #!) 会告诉操作系统使用什么解释器来运行该脚本。在这种情况下/bin/sh,例如。

有一篇关于它的维基百科文章以获取更多信息。

于 2011-09-09T19:58:22.257 回答
7

第一行告诉 shell,如果你直接执行脚本(./run.sh;而不是 /bin/sh run.sh),它应该使用那个程序(在这种情况下是 /bin/sh)来解释它。

您也可以使用它来传递参数,通常是 -e(出错时退出),或使用其他程序(/bin/awk、/usr/bin/perl 等)。

于 2011-09-09T19:58:59.140 回答
-5

#!/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
于 2015-01-07T11:10:26.663 回答