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

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

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

有没有人能告诉我 #!/bin/sh开头的注释是什么意思?

236366 次浏览

它称为 开始吧,并告诉父 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部分,否则可能导致直译语言中的语法错误。

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

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

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

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

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

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

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

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