我有一个库 - 用户将创建可执行文件,可能使用 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 不太方便,而且理论上运行起来更方便?
您可以使用 分两步来实现这一点
execve
:要求 C 库要求内核执行目标,如果失败,请使用 重试foobar
。这实际上是 shell 通常实现执行的方式。还有其他
exec
家庭功能可以使用 运行无shebang 脚本/bin/sh
,但execve
不会。当我在我的 shell 中执行一个文件时究竟会发生什么?关于这个主题有更多的细节。