首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >那#怎么了!她成功了吗?

那#怎么了!她成功了吗?
EN

Stack Overflow用户
提问于 2010-06-09 19:27:30
回答 2查看 16.2K关注 0票数 62

在脚本中,您必须在第一行中包含一个#!,后面跟着将执行脚本的程序路径(例如: sh、perl)。

据我所知,#字符表示注释的开始,执行脚本的程序应该忽略该行。这第一行似乎是在某个时候被某种东西读取,以便脚本被适当的程序执行。

有谁能更清楚地了解#!的工作原理吗?

我对此很好奇,所以答案越深入越好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-09 19:37:39

建议阅读:

  • UNIX常见问题:为什么有些脚本以#!.开头?
  • #!魔术,关于各种Unix口味的shebang/散列机制的详细信息。
  • 维基百科:

unix内核的程序加载程序负责这样做。当调用exec()时,它要求内核在其参数处从文件中加载程序。然后,它将检查文件的前16位,以查看它的可执行格式。如果发现这些位是#!,它将使用文件第一行的其余部分来查找应该启动的程序,并提供它试图启动的文件的名称(脚本)作为解释器程序的最后一个参数。

然后解释器正常运行,并将#!视为注释行。

票数 68
EN

Stack Overflow用户

发布于 2016-12-02 18:37:01

Linux内核exec 系统调用使用初始字节来标识文件类型。

当你在狂欢时:

代码语言:javascript
复制
./something

在Linux上,这使用路径exec ./something调用./something系统。

在传递给execscript.c#L25的文件的内核中调用这一行

代码语言:javascript
复制
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))

它读取文件的第一个字节,并将它们与#!进行比较。

如果比较是正确的,则行的其余部分由Linux内核进行解析,该内核使用路径exec和当前文件作为第一个参数进行另一次/usr/bin/env python调用:

代码语言:javascript
复制
/usr/bin/env python /path/to/script.py

这适用于任何使用#作为注释字符的脚本语言。

是的,您可以使用以下方法进行无限循环:

代码语言:javascript
复制
printf '#!/a\n' | sudo tee /a
sudo chmod +x /a
/a

Bash识别错误:

代码语言:javascript
复制
-bash: /a: /a: bad interpreter: Too many levels of symbolic links

#!是人类可读的,但这是不必要的。

如果文件以不同的字节启动,那么exec系统调用将使用不同的处理程序。另一个最重要的内置处理程序是对ELF可执行文件:elf.c#L1305,它检查字节7f 45 4c 46 (这也恰好是人类可读的.ELF)。让我们通过读取/bin/ls的4个头字节来确认这一点,这是一个ELF可执行文件:

代码语言:javascript
复制
head -c 4 "$(which ls)" | hd 

产出:

代码语言:javascript
复制
00000000  7f 45 4c 46                                       |.ELF|
00000004                                                                 

因此,当内核看到这些字节时,它接受ELF文件,正确地将其放入内存,并使用它启动一个新进程。另见:内核如何获得在linux下运行的可执行二进制文件?

最后,可以使用binfmt_misc机制添加自己的shebang处理程序。例如,您可以添加一个文件。这种机制甚至通过文件扩展名支持处理程序。另一个应用程序是使用QEMU透明地运行不同体系结构的可执行文件

但是,我不认为POSIX指定了shebangs:https://unix.stackexchange.com/a/346214/32558,尽管它确实在基本原理部分和形式中提到了“如果系统支持可执行脚本,可能会发生一些事情”。然而,macOS和FreeBSD似乎也实现了它。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3009192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档