Shell脚本中使用shebang的作用

3
在Linux中,我们通常在脚本中添加一个shebang来调用相应的解释器。我尝试了以下示例。
我写了一个没有shebang但有可执行权限的shell脚本。我可以使用./来执行它。但是如果我写一个类似的Python程序,没有shebang,我就无法执行它。
为什么会这样呢?据我所知,shebang是必需的,以便找到解释器。那么为什么shell脚本能够工作,而Python脚本不能呢?

我还没有调查过这个问题,但我认为(并且这很合理),它可能默认将其解释为一个 shell 脚本(没有其他特殊解释器)。 - lurker
超出规格了。我相当确定解释器会尝试运行它自己(也就是说,/bin/bash 将尝试使用 /bin/bash/bin/sh 将尝试使用 /bin/sh 等等)。 - zebediah49
5个回答

5

我的假设是没有shebang的脚本会在当前环境下执行,在命令行中默认使用你的默认shell,例如/bin/bash


如果我的当前 shell 是 Python shell,那么没有 shebang 的 Python 脚本能否工作? - shar
1
正如Joran Beasley所指出的那样,没有Python shell存在,如果有的话,谁知道它会做什么。大多数类似于sh的shell在缺少shebang的情况下尝试将脚本作为自己执行,因此,如果一个假设的Python shell这样做了,那么没有shebang的Python脚本可能会起作用。 - pjmorse

4

只有在你所针对的shell中,shell脚本才能正常运行......并没有Python shell......因此,如果没有显式调用Python(通过shebang或命令行),Python将永远不会起作用。


3

2

这里有一个微妙的区别。如果目标是二进制文件或以 #! 开头,则 shell 成功调用 execv。如果目标是没有 shebang 的文本文件,则调用 execv 将失败,shell 可以尝试在 /bin/sh 或其他地方启动它。


0

http://en.wikipedia.org/wiki/Shebang_(Unix)

在类Unix操作系统中,当带有shebang的脚本作为程序运行时,程序加载器将解析脚本初始行的其余部分作为解释器指令;指定的解释器程序被运行,将最初尝试运行脚本时使用的路径作为参数传递给它。
现在,如果没有找到#!,则每行都被解释为本地shell命令。因此,如果您编写一个bash脚本并在bash shell下运行它,它将正常工作。如果您在tcsh shell中运行相同的bash脚本,则需要加上初始的#!/usr/bin/tcsh才能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接