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



From https://unix.stackexchange.com/a/2910/674

。Shebang (#!( 通常的实现方式:

  1. 内核打开可执行文件,发现它以 #!! 开头。
  2. 内核关闭可执行文件并打开解释器。
  3. 内核将脚本的路径插入到参数列表中(如 argv[1](,并执行解释器。

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

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

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

    如果execlp()execvp()使用以下之一找到可执行文件 路径前缀,但该文件不是计算机可执行文件 由链接编辑器生成,该函数假定文件是 shell 脚本并尝试使用文件名作为输入调用/bin/sh外壳。

    可以使用 shebangexeclp()execvp()执行脚本吗 适用于任何语言的解释器(Python,Perl,Bash等(。

谢谢。

它应该由execve()实现。exec系列中的所有其他函数都只是围绕此的包装器(以p结尾的函数执行$PATH搜索以查找可执行参数,l通过迭代可变参数列表来构建argv数组的函数(。

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

#!/bin/cat

以创建一个在执行时仅打印自身的文件。

最新更新