2011-09-09 51 views
109

我会通过一些shell脚本的教程,发现下面的示例程序:在UNIX shell脚本中,“#!/ bin/sh”是什么意思?

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

谁能告诉什么是提的是在注释“!/bin/sh”的意义是什么?

+1

[认领](http://en.wikipedia.org/wiki/Shebang_%28Unix%29) – drootang

+1

上askubuntu很好的解释:http://askubuntu.com/questions/141928/what-is- bin-sh-and-bin-bash之间的区别 –

+1

[为什么需要在脚本文件的开头放置#!/ bin/bash?](http://stackoverflow.com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-beginning-of-a-script-file) –

回答

110

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

例如

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

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

+3

它通常是内核,而不是shell,它处理这个。 shell简单地调用文件上的'exec()'系统调用。 – tripleee

7

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

有关Wikipedia article的更多信息。

5

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

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

41

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

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

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

-3

#!/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 
+1

堆栈溢出不是Twitter。请花些时间来拼写出“u”和“1st”等单词。你正在帮助写一本参考书,所以正确的语法和拼写是重要的。另外,请注意格式正确。可以从命令行发出的命令(比如'ps')和代码片段(如#!/ bin/sh)应该被格式化。 –

+0

我试图清理这里的英语,但我仍然不确定它的含义。我想答案试图说脚本中的命令将作为不同的命令执行,并且添加一个shebang将在脚本列表中显示脚本作为单个命令。这实际上并不正确。 – tripleee

相关问题