gpt4 book ai didi

linux - Linux API 中的什么函数使用 shebang 执行脚本文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:49 25 4
gpt4 key购买 nike

来自 https://unix.stackexchange.com/a/2910/674

... the way shebang (#!) is typically implemented:

  1. The kernel opens the executable, and finds that it starts with #!.
  2. The kernel closes the executable and opens the interpreter instead.
  3. The kernel inserts the path to the script to the argument list (as argv[1]), and executes the interpreter.

我想知道 Linux API 中的哪个函数实现了上述步骤以使用 shebang 执行脚本文件?

我考虑了以下可能性,但似乎都不匹配:

  • execve() 将无法执行脚本。
  • execlp()execvp() 似乎只是为了执行一个没有任何 shebang 的脚本,默认为 /bin/sh,根据APUE:

    If either execlp() or execvp() finds an executable file using one of the path prefixes, but the file isn’t a machine executable that was generated by the link editor, the function assumes that the file is a shell script and tries to invoke /bin/sh with the filename as input to the shell.

    execlp()execvp() 是否可以使用 shebang 执行脚本适用于任何语言的解释器(Python、Perl、Bash 等)。

谢谢。

最佳答案

应该由execve()实现。 exec 系列中的所有其他函数只是对此的包装(以 p 结尾的函数执行 $PATH 搜索以查找可执行参数,带有 l 的那些通过遍历可变参数列表来构建 argv 数组)。

对于任何语言的解释器,它的工作原理都是一样的——该机制并不真正关心 shebang 行中的程序做了什么,它只是使用脚本路径名作为参数来执行它。你甚至可以这样做:

#!/bin/cat

创建一个文件,当您执行它时,它会自行打印。

关于linux - Linux API 中的什么函数使用 shebang 执行脚本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50143006/

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