让我们假设shebang序列包含在一个单独文件中的脚本中;例如,我创建了一个example.sh脚本文件。
如果我在文件中添加shebang序列:
#!/bin/sh我如何确定上面的命令没有被确认为注释(在Linux脚本中,#经常被视为评论的开始。
发布于 2015-10-03 21:20:37
只有当脚本是可执行的和"#!“是文件的前两个字符。
操作系统正在查看文件,检查前两个字节,并看到它们是(十六进制) "23“和"21",它们是"#”和"!“的ASCII代码。
如果这些内容稍后出现在文件中,或者您没有直接执行该文件,则该行实际上被视为注释,因为它以#开头。
事实上,如果这一行是:
#!/bin/sh然后,操作系统找到了该系统,因此运行:
/bin/sh [filename]在运行脚本时,/bin/sh确实忽略了作为注释的shebang行。
当涉及到一些不使用#作为注释的其他语言时,通常会向解释器传递一个特殊标志,以便它知道如何忽略第一行(例如#!/usr/local/bin/tcc -run)。
发布于 2015-10-03 22:50:38
最初的shell没有这个特性,但是有注释。需要一种机制,以便用户可以指定要使用的shell/解释器。这种机制不能不必要地破坏旧系统(为原始shell编写的任何新脚本,必须允许指定原始shell,也不能在不知道这个新系统的旧系统(运行原始shell的早期版本)上中断。因此,它必须看起来像一个注释的原始外壳。这一新系统还必须减少错误触发的风险,同时不给未来的用户带来负担。
因此,决定在档案开始时添加一项特别评论。
发布于 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
https://unix.stackexchange.com/questions/233755
复制相似问题