在UNIX shell脚本中,“#!/ bin / sh”行是什么意思?


142

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

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

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



2
:在askubuntu很好的解释askubuntu.com/questions/141928/...
fkoessler


Answers:


143

它称为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部分,否则该部分可能是该特定语言的语法错误。


6
通常是内核而不是外壳程序来处理。Shell只是exec()在文件上调用系统调用。
2013年

47

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

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

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


10

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

有一个维基百科的文章关于它的更多信息。


5

第一行告诉外壳程序,如果您直接执行脚本(./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

1
堆栈溢出不是Twitter。请花时间实际拼出诸如“ u”和“ 1st”之类的单词。您正在帮助编写参考书,因此正确的语法和拼写很重要。另外,请注意正确的格式。应该格式化从命令行发出的命令(如ps)和代码摘录(如)#!/bin/sh
Tin Man'1

我试图在这里整理英语,但是我仍然不确定这是什么意思。我猜答案是说脚本中的命令将作为不同的命令执行,添加shebang会将脚本显示为进程列表中的单个命令。这不是真的。
三胞胎
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.