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

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

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

任何人都可以告诉在评论中提及“ !/bin/sh ”的意义吗?

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

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

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

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

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

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

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

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

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