首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本中的Shebang序列

脚本中的Shebang序列
EN

Unix & Linux用户
提问于 2015-10-03 20:59:59
回答 3查看 244关注 0票数 0

让我们假设shebang序列包含在一个单独文件中的脚本中;例如,我创建了一个example.sh脚本文件。

如果我在文件中添加shebang序列:

代码语言:javascript
复制
 #!/bin/sh

我如何确定上面的命令没有被确认为注释(在Linux脚本中,#经常被视为评论的开始。

EN

回答 3

Unix & Linux用户

发布于 2015-10-03 21:20:37

只有当脚本是可执行的和"#!“是文件的前两个字符。

操作系统正在查看文件,检查前两个字节,并看到它们是(十六进制) "23“和"21",它们是"#”和"!“的ASCII代码。

如果这些内容稍后出现在文件中,或者您没有直接执行该文件,则该行实际上被视为注释,因为它以#开头。

事实上,如果这一行是:

代码语言:javascript
复制
#!/bin/sh

然后,操作系统找到了该系统,因此运行:

代码语言:javascript
复制
/bin/sh [filename]

在运行脚本时,/bin/sh确实忽略了作为注释的shebang行。

当涉及到一些不使用#作为注释的其他语言时,通常会向解释器传递一个特殊标志,以便它知道如何忽略第一行(例如#!/usr/local/bin/tcc -run)。

票数 5
EN

Unix & Linux用户

发布于 2015-10-03 22:50:38

最初的shell没有这个特性,但是有注释。需要一种机制,以便用户可以指定要使用的shell/解释器。这种机制不能不必要地破坏旧系统(为原始shell编写的任何新脚本,必须允许指定原始shell,也不能在不知道这个新系统的旧系统(运行原始shell的早期版本)上中断。因此,它必须看起来像一个注释的原始外壳。这一新系统还必须减少错误触发的风险,同时不给未来的用户带来负担。

因此,决定在档案开始时添加一项特别评论。

票数 1
EN

Unix & Linux用户

发布于 2015-10-03 21:16:14

这是Denis在UNIX中引入的一种机制,因此Linux继承了这个特性。在shell本身中,将检查第一行的“魔术字符串”,如果找到它,则使用在shebang之后指定的解释器。在一些bsd4.0源代码中引用了这个特性第一次提到的邮件,您可以在这里看到它:http://www.in-ulm.de/~mascheck/various/shebang/4.0BSD_新系统_sys1.c.html

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

https://unix.stackexchange.com/questions/233755

复制
相关文章

相似问题

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