“#!/ bin / sh”行在UNIX shell脚本中的含义是什么?

时间:2011-09-09 19:54:41

标签: shell unix sh shebang

我正在阅读一些shell脚本教程并找到以下示例程序:

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

有人可以说一下在评论中提及“!/bin/sh”有什么意义吗?

5 个答案:

答案 0 :(得分:132)

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

e.g。

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

它是作为注释实现的,因此该行中的任何内容都不会与指定的解释器“相关”。例如所有脚本语言都倾向于理解以#开头的行是注释,并且会忽略!/usr/bin/whatever部分,否则可能是该特定语言的语法错误。

答案 1 :(得分:42)

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

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

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

答案 2 :(得分:7)

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

有关Wikipedia article的更多信息。

答案 3 :(得分:5)

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

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

答案 4 :(得分:-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