更改可能缺少 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 中執行檔案時到底會發生什麼事?關於這個主題有更多細節。

相關內容