gpt4 book ai didi

bash - shebang 标志与设置内置标志之间的区别

转载 作者:行者123 更新时间:2023-12-03 18:34:19 26 4
gpt4 key购买 nike

与使用 set 在 shebang 行上传递给脚本的标志有关的行为是否存在差异?内置?

例如:

#!/bin/bash -e

# do stuff

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

(问题不是针对 -e 标志,而是针对任何此类标志)。

显然是 set [flags]仅从设置的点开始生效。但是在功能/行为方面还有其他区别吗?

POSIX shell 中的行为也一样吗?

最佳答案

are there any other differences in functionality/behaviour?


当您的文件具有可执行权限并被执行时,内核会解析 shebang 行。
当您的文件在 shell 下执行时,如 bash ./script.sh那么shebang只是一个评论。因此它将被忽略,并且您的脚本将使用任何调用者标志运行。将您的标志放在 shebang 之后将确保在任何一种情况下都在您的脚本中设置正确的标志。
shebang是 parsed by kernel .这基本上意味着行为因内核而异,因操作系统而异。一些操作系统根本不处理shebang中的参数并忽略所有参数。一些内核解析例如 #!/bin/sh -a -bexecl("/bin/sh", "-a -b")有些为 execl("/bin/sh", "-a", "-b") .将 shebang 行解析为可执行文件和参数是由与您的 shell 不同的一些其他代码完成的。有时如果 #!后面有空格喜欢 #! /bin/sh实用程序不会将其识别为有效的shebang。甚至还有最近的 linux kernel regression with too long shebang line .
系统之间解释shebang的行为不同,因此您无法确定,因此最好 set shebang之后的选项。

Is behaviour same in a POSIX shell, too?


POSIX shell 不会(必须)解释您的shebang。如果您询问是否执行 sh -eset -e在 posix shell 中具有相同的行为,然后 yes, the option -e on command line具有与 set -e 相同的行为.
我找不到 shebang 线的规范,也不应该如何在 posix specification 中解释它。 .我可以在 execve 文档中看到:

Another way that some historical implementations handle shell scripts is by recognizing the first two bytes of the file as the character string "#!" and using the remainder of the first line of the file as the name of the command interpreter to execute.


那些“历史实现”似乎在今天仍然被广泛使用。
shebang 行在 exec* 之后由内核解析调用。但是当你在做 sh <script>popensystem shell 可以(但不必)将 shebang 行本身解释为扩展,而不依赖于内核实现,来自 posix:

Shell Introduction

  1. The shell reads its input from a file (see sh), from the −c option or from the system() and popen() functions defined in the System Interfaces volume of POSIX.1-200x. If the first line of a file of shell commands starts with the characters"#!",the results are unspecified.

至于bash,它看起来像bash first tries execve ,那么如果找不到内核无法运行可执行文件的原因, if the file has a shebang ,然后 it parses shebang on its own找导出译员。

关于bash - shebang 标志与设置内置标志之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61978350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com