我有一個庫 - 用戶將創建可執行文件,可能使用 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 中執行檔案時到底會發生什麼事?關於這個主題有更多細節。