"#!/ bin/sh"行在UNIX shell脚本中的含义是什么?

Jak*_*ake 134 unix shell shebang sh

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

#!/bin/sh
clear
echo "HELLO WORLD"
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我#!/bin/sh在评论中提及' ' 的意义是什么?

Mar*_*c B 136

它被称为shebang,并告诉父shell应该使用哪个解释器来执行脚本.

例如

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.
Run Code Online (Sandbox Code Playgroud)

它被实现为注释,以便该行中的任何内容都不会与指定的解释器"相关".例如,所有脚本语言都倾向于理解以一行开头的#是注释,并且将忽略该!/usr/bin/whatever部分,否则该部分可能是该特定语言中的语法错误.

  • 它通常是内核,而不是shell,它处理它.shell只是在文件上调用`exec()`系统调用. (4认同)

Foo*_*Bah 45

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

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

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


Kus*_*nda 9

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

有关于它的维基百科文章有更多信息.


Kev*_*vin 5

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

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