2012-06-15 5 views
8

POSIX spec's description of the PATH environment variableに従って実行するためPATHを検索し、実行可能ファイルの絶対パスを返すPOSIX機能はありますか?そうでない場合PATHで実行ファイルを検索するPOSIX関数?

PATHを検索するための、簡単で安全な、標準、および信頼性の高い方法はありますか?

編集: glibc's execvpe() function独自のPATH検索を行いますので、私は、標準で定義されている特定のPATH検索機能がありません推測しています。

編集2:私は をテストし、維持する必要が

  • DRY
  • もっとコードを:私は他の誰かのコードをコピーするか、PATHはいくつかの理由のために自分を検索実装する必要はありません
  • 可能なライセンス問題
  • POSIXは、 "PATHが設定されていないか、またはヌルに設定されている場合、パス検索は実装定義です。"私は、システムがないものは何でもと一致するようにこれらのケースで行動をしたいと思いますが、私が呼び出すことができる標準機能がない場合、私はこれを行うことはできません。
+1

'execvp'と' execlp'はPOSIX標準関数です。あなたは$ PATHを検索する関数を探していますか? –

+0

@larsmans:yes、実行ファイルへのフルパスを含む文字列を返します(見つかった場合) –

答えて

7

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

ない場合は、PATHを検索するための、簡単で安全な、標準、および信頼性の高い方法はありますか?

はい、いいえ。はい。PATHという形式の標準があります。この標準から、実装の正確さと信頼性が決まります。

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

PATHが設定されていないか、またはnullに設定されている場合、パス検索は実装定義です。あなたはいつもは移植性execvpが何をするか複製することはできませんを意味しますが、/bin:/usr/binを検索することはかなり安全な賭けである

。あるいは、この場合はエラーを発生させてください。

(私はPOSIXがこの機能を持っていればいいと思いますが、そこにはありません。その後、

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

し、その出力を読み:ような何かをやっについてどう)

3

コマンドラインツールwhichがこれを行います。 here's the man page

and the source

+0

何百行もの他のコードを単純にすることは考慮しません。 –

+1

これを行う簡単な方法があれば、既に完了しているはずです。これはposix仕様の一部ではありません。 – gcochard

+1

非常に簡単です。 '$ PATH'の要素を反復することはCの2行です。何かがあった場合、POSIXにない理由は*単純すぎる、つまり自分自身を行うのが簡単であるからです。 –

0

?これにより、システムが空/未設定の処理に一致する動作となります。手動でPATHを検索するより簡単な場合があります。

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

  • somecommandは、ユーザから来る場合、それはコードインジェクション攻撃を防ぐために消毒しなければならないかもしれません。それは複雑さを増すだろう。
  • 可能なすべてのエラーケースを処理しながら確実にストリームを読み込むことは簡単ではありません。複雑さが増します。
  • がシェルに組み込まれている場合(例:set)、偽の結果が返されます。この場合は検出可能なはずですが、それでは何ですか?複雑さが増します。
関連する問題