9

POSIX仕様の環境変数PATHの説明に従って実行可能ファイルを検索し、実行可能ファイルへの絶対パスを返すPOSIX関数はありますか?PATH

そうでない場合、検索するための簡単で、安全で、標準的で、信頼できる方法はありますPATHか?

編集: glibcのexecvpe()関数は独自の検索を行うため、標準で定義されてPATHいる特定の検索関数はないと思います。PATH

編集2:PATHいくつかの理由で、 他の人のコードをコピーしたり、自分で検索を実装したりしたくない:

  • ドライ
  • テストして維持しなければならないより多くのコード
  • 考えられるライセンスの問題
  • POSIXは、「PATHが未設定またはnullに設定されている場合、パス検索は実装定義です」と述べています。これらの場合の動作は、システムが実行するものと一致するようにしたいのですが、呼び出すことができる標準関数がない場合、これを行うことはできません。
4

3 に答える 3

8

POSIX仕様のPATH環境変数の説明に従って実行可能ファイルをPATHで検索し、実行可能ファイルへの絶対パスを返すPOSIX関数はありますか?

いいえ。

そうでない場合、PATHを検索するための簡単で、安全で、標準的で、信頼できる方法はありますか?

はいといいえ。はい、の形式には標準があり、そこPATHから実装の正確性/信頼性が続きます。

いいえ、これを行う標準機能はありません。コードをコピーするのが最善の策です。

PATHが設定されていないか、nullに設定されている場合、パス検索は実装定義です。

つまり、常に移植可能に複製できるとは限りませんexecvpが、検索/bin:/usr/binはかなり安全な方法です。または、この場合はエラーを発生させます。

(POSIXにこの機能があれば良かったと思いますが、それはありません。)

于 2012-06-16T11:47:28.517 に答える
3

コマンドラインツールwhichがそれを行います。これがmanページです

とソース

于 2012-06-15T21:53:09.383 に答える
-1

次のようなことはどうですか?

FILE *f = popen("command -v somecommand", "r")

そしてその出力を読みますか?これにより、システムの空/未設定の処理と一致する動作が発生しPATH、手動で検索するよりも簡単になる場合がありますPATH

このアプローチにはいくつかの欠点があります。

  • ユーザーからのものである場合somecommandは、コードインジェクション攻撃を防ぐためにサニタイズする必要がある場合があります。それは複雑さを増すでしょう。
  • 考えられるすべてのエラーケースを処理しながらストリームを確実に読み取ることは簡単ではありません。より複雑。
  • somecommandがシェルの特別な組み込み(たとえば)である場合set、偽の結果が返されます。このケースは検出可能であるはずですが、それではどうしますか?より複雑。
于 2012-06-17T05:02:38.557 に答える