私はライブラリを持っています。ユーザーはおそらく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
。これは実際にはシェルが通常実行を実行する方法です。
exec
shebang-lessスクリプトを実行するために使用できる他の一連の関数が/bin/sh
ありますが、これはexecve
そうではありません。
シェルからファイルを実行すると、正確に何が起こりますか?このトピックの詳細があります。