在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