更改可能缺少 shebang 的文件的默认可执行文件

更改可能缺少 shebang 的文件的默认可执行文件

我有一个库 - 用户将创建可执行文件,可能使用 hashbang 来告诉exec要使用哪个可执行文件。如果他们省略了 hashbang,那么我认为大多数系统默认为/bin/sh,我想更改该默认值。

所以有些文件可能以以下内容开头:

#!/usr/bin/env foobar

其他文件可能以以下内容开头:

 #!/usr/bin/env perl

或者

 #!/usr/bin/env ruby

在某些情况下,用户会完全忽略 hashbang。在这种情况下,我仍然会直接执行该文件,并且我想默认使用foobar可执行文件。

换句话说,我事先不知道 hashbang 是什么,如果没有 hashbang,我希望默认值为 ,foobar而不是默认值。/bin/sh

我认为做我正在做的事情的方法是创建一个可以exec首先运行的可执行文件,如果失败并出现特定错误消息,那么使用foobar可执行文件间接运行脚本?

像这样的东西:

function run {
  stdio=$("$1" 2>&1)
  if [[ stdout/stderr matches a certain error message ]]; then
    foobar $1
  fi
}

我的问题是 - 有谁知道我在说什么 - 有谁知道如果不存在 hashbang,我如何默认为特定的可执行文件?并不是说理论上检查是否有 hashbang 不太方便,而是理论上运行它更方便?

答案1

您可以使用以下两个步骤来实现此目的execve:要求 C 库要求内核执行目标,如果失败,请使用 重试foobar。这实际上是 shell 通常执行执行的方式。

还有其他exec系列函数可以使用 运行无 shebang 脚本/bin/sh,但execve不会。

当我在 shell 中执行文件时到底会发生什么?关于这个主题有更多细节。

相关内容