shebang旗帜与设置内置旗帜的区别。

问题描述 投票:0回答:1

在shebang行上传递给脚本的标志与使用 set 内置?

比如说,。

#!/bin/bash -e

# do stuff

vs.

#!/bin/bash
set -e
# do stuff

(这个问题不是针对 -e 标志,但在一般情况下,对于任何这样的标志)。)

显然 set [flags] 只有从它被设定的点开始才是有效的。但在功能行为上是否有其他的不同?

在POSIX shell中的行为也是一样的吗?

bash sh posix
1个回答
5
投票

在功能行为上有什么其他的区别吗?

当你的文件有可执行的权限并被执行时,那么shebang行会被内核解析。

当你的文件在shell下执行时,比如 bash ./script.sh 那么shebang只是一个注释。所以它将被忽略,而你的脚本将以任何调用者的标志运行。把你的标志放在 shebang 后面,可以确保在任何情况下,你的脚本都会设置适当的标志。

shebang是 经内核解析. 这基本上意味着,不同的内核,不同的操作系统,其行为是不同的。有些操作系统根本没有处理shebang中的参数,忽略了所有的参数。例如,有些内核会解析 #!/bin/sh -a -b 作为 execl("/bin/sh", "-a -b") 有的 execl("/bin/sh", "-a", "-b"). 将shebang行解析为可执行文件和参数是由其他代码完成的,与你的shell不同。有时如果在 #! 喜欢 #! /bin/sh 工具不承认它是一个有效的shebang。(我记得我读到过一个最近的linux内核bug,如果shebang参数太长,就会被截断)。

不同的系统对shebang的解释行为不同,所以你不能确定,所以最好的方法是 set 选项后的shebang。

在POSIX shell中的行为也一样吗?

POSIX shell不(必须)解释你的shebang。如果你问的是执行 sh -eset -e 在posix shell中具有同样的行为,那么 是的,该选项 -e 在命令行上 的行为与 set -e.

我找不到shebang线的规格,也找不到它应该如何解释在 posix规格. 我可以在execve文档中看到。

一些历史上的实现处理shell脚本的另一种方式是将文件的前两个字节识别为字符串 "#!",并将文件第一行的剩余部分作为要执行的命令解释器的名称。

这些 "历史性的实现 "在今天看来仍然得到了非常广泛的应用。

shebang行被内核解析后,会在 exec* 呼叫。但当你在做 sh <script>popensystem炮弹 可以 (但不必)自己把shebang行解释为扩展,而不是依赖内核实现,来自posix。

Shell简介

  1. shell从文件中读取输入(见sh),从 −c 选项或从 system()popen() 在POSIX.1-200x的系统接口卷中定义的函数。 如果shell命令文件的第一行以 "#!"开头,则结果不详。

至于bash,它看起来像bash一样 初试啼声如果它找不到内核运行可执行文件失败的原因。如果文件有一个shebang那么 它能自行解析Shebang。 来找出解释器。


5
投票

有些操作系统可能不允许或限制在shebang中使用参数。这种限制不适用于 set 脚本中的命令。


1
投票

manpage上说,"-e "根据POSIX模式与否有不同的行为。除此之外,我从来没有注意到设置参数和扩展shebang之间的区别。你为什么问这个问题?

© www.soinside.com 2019 - 2024. All rights reserved.