shebangが見つからない可能性があるファイルのデフォルトの実行可能ファイルの変更

shebangが見つからない可能性があるファイルのデフォルトの実行可能ファイルの変更

私はライブラリを持っています。ユーザーはおそらくhashbangを使用して、execどの実行可能ファイルを使用するかを示す実行可能ファイルを生成します。ほとんどのシステムがデフォルトで設定されているハッシュバンを省略した場合、その/bin/shデフォルト値を変更したいと思います。

したがって、一部のファイルは次のように始まる可能性があります。

#!/usr/bin/env foobar

他のファイルは次から始めることができます。

 #!/usr/bin/env perl

または

 #!/usr/bin/env ruby

場合によっては、ユーザーはハッシュバンを完全に無視します。この場合でも、ファイルを直接実行し、デフォルトfoobarで実行ファイルを使用したいと思います。

つまり、ハッシュバンが何であるかを事前に知ることができず、ハッシュバンがない場合はデフォルトではfoobarなくデフォルトであることを望みます。/bin/sh

私がやっていることをする方法は、exec最初に実行できる実行可能ファイルを作成し、特定のエラーメッセージで失敗した場合は、その実行可能foobarファイルを使用してスクリプトを間接的に実行することです。

このような:

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

私の質問は - 私が言うことを知っている人はいますか?ハッシュバンが存在しない場合、特定の実行可能ファイルをデフォルト値に設定する方法を知っている人はいますか?ハッシュバンがあるかどうかを確認するのは理論的には便利ではありませんが、実行するのは理論的には便利です。

ベストアンサー1

次の2つのステップを使用してこれを達成できますexecve。 Cライブラリにカーネルにターゲットの実行を要求し、失敗した場合はretryを使用してくださいfoobar。これは実際にはシェルが通常実行を実行する方法です。

execshebang-lessスクリプトを実行するために使用できる他の一連の関数が/bin/shありますが、これはexecveそうではありません。

シェルからファイルを実行すると、正確に何が起こりますか?このトピックの詳細があります。

おすすめ記事