ライブラリがあります。ユーザーは実行可能ファイルを作成し、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
では実行されません。
シェルでファイルを実行すると、具体的に何が起こりますか?このトピックについてはさらに詳しい情報があります。