UNIX shell 脚本中的“#!/bin/sh”行是啥意思?

Posted

技术标签:

【中文标题】UNIX shell 脚本中的“#!/bin/sh”行是啥意思?【英文标题】:What does the line "#!/bin/sh" mean in a UNIX shell script?UNIX shell 脚本中的“#!/bin/sh”行是什么意思? 【发布时间】:2011-11-14 01:42:40 【问题描述】:

我在浏览一些 shell 脚本教程时发现了以下示例程序:

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

谁能告诉我开头#!/bin/sh的评论有什么意义?

【问题讨论】:

Shebang 关于askubuntu的好解释:askubuntu.com/questions/141928/… Why do you need to put #!/bin/bash at the beginning of a script file?的可能重复 Why do people write #!/usr/bin/env python on the first line of a Python script?的可能重复 【参考方案1】:

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

【讨论】:

处理这个的通常是内核,而不是外壳。 shell 只是简单地对文件调用exec() 系统调用。【参考方案2】:

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

【讨论】:

Stack Overflow 不是 Twitter。请花时间实际拼出诸如“u”和“1st”之类的单词。您正在帮助编写参考书,因此正确的语法和拼写非常重要。另外,请注意正确的格式。从命令行发出的命令(如ps)和代码摘录(如#!/bin/sh)应进行格式化。 我试图清理这里的英文,但我仍然不确定它是什么意思。我猜答案试图说明脚本中的命令将作为不同的命令执行,并且添加 shebang 会将脚本显示为进程列表中的单个命令。事实并非如此。【参考方案3】:

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

有一个关于它的Wikipedia article 以了解更多信息。

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于UNIX shell 脚本中的“#!/bin/sh”行是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

shell 1基础

Shell脚本简单实例

shell脚本报错:-bash:/bin/sh^M: bad interpreter:

#!/bin/sh与#!/bin/bash的区别

#!/bin/sh与#!/bin/bash的区别

linux的shell编程中#!/bin/sh和bash是啥意思?