我有一个库 - 用户将创建可执行文件,可能使用 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 中执行文件时到底会发生什么?关于这个主题有更多细节。