シェバンが欠落している可能性のあるファイルのデフォルトの実行可能ファイルを変更する

シェバンが欠落している可能性のあるファイルのデフォルトの実行可能ファイルを変更する

ライブラリがあります。ユーザーは実行可能ファイルを作成し、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 ライブラリにカーネルにターゲットの実行を依頼するように指示し、それが失敗した場合は で再試行しますfoobar。これは実際にシェルが実行を実装する一般的な方法です。

execでシェバンなしのスクリプトを実行する他のファミリー関数もあります/bin/shが、execveでは実行されません。

シェルでファイルを実行すると、具体的に何が起こりますか?このトピックについてはさらに詳しい情報があります。

関連情報