2011-08-19 7 views
7

私は、バイナリの完全なパス名を見つけるために$ PATHを歩かなければならないCアプリケーションで作業しています。唯一許可されている依存関係はglibcです(つまり、外部プログラムを呼び出すことはありません)。通常の場合、getenv( "PATH")をコロンで分割し、各ディレクトリを1つずつチェックするだけですが、すべての可能なコーナーケースを確実にカバーしたいと思います。私は何を見なければならないのですか?具体的には、〜で始まるパスが$ HOMEに展開されることを意味する相対パス、または:charが含まれるパスが許可されていますか?

答えて

11

私が驚いたことの1つは、空の文字列がPATHであることです。現在のディレクトリを意味します。 PATHの末尾または先頭にある2つの隣接するコロンまたはコロンは、カレントディレクトリが含まれることを意味します。これは例えばman bashに記載されています。

POSIX specificationにもあります。

だから

PATH=:/bin 
PATH=/bin: 
PATH=/bin::/usr/bin 

すべては、私は、これは一般的にLinuxで問題があるわからないんだけど、あなたのコードが動作することを確認してください

+3

+1「which」のソースコードを確認した後、これが唯一のコーナーケースであるようです。 ''はフルパスが与えられ、ファイルが実行可能であるかどうか最初にチェックします。次に、パスの各コンポーネントを前に追加し、空のパスコンポーネントを現在のディレクトリに置き換えて再度チェックします。 –

+0

仕様に従って、 'which'の実装といくつかの一般的な標準シェルは、かなり良い見通しを与えるべきです。 – Novelocrat

2

PATHPATHは、いくつかのファンキーを持っている場合、現在のディレクトリがあることを意味します(UTF-8のような)エンコーディングを使用して、手紙でディレクトリを処理します。ファイルシステムのエンコーディングに依存する可能性があります。

私は、彼のユーザ名に豪華な手紙を持っていたロシアの男のバグ報告(彼のホームディレクトリ名はPATH)に取り組んでいました。

+0

いいえ、エンコーディングは 'PATH'とは無関係です。プログラムがそれを考慮すれば、それはバグです。 –

+0

@R:面白い;その主張をサポートするための仕様がありますか?私が理解していることは、 'PATH'を解析するためには(' bytes'のシーケンスではなく)一連の文字として扱わなければならないということです。そのため、エンコーディングを認識する必要があります。 –

+1

'PATH'で特別な文字は': 'だけなので、あなたの主張が妥当性を持つ唯一の時間は、従来のWindows指向のCJKエンコーディングですが、通常Unixでは使用できないと考えられています。 –

1

これはマイナーですが、まだ言及されていないので追加します。 $ PATHには、絶対パスと相対パスの両方を含めることができます。各ディレクトリにchdir(2)でパスリストをクロールする場合は、クロールの各繰り返しで元の作業ディレクトリ(getcwd(3))とchdir(2)を追跡する必要があります。

1

既存の答えは、それのほとんどをカバーするが、それはまだ答えていなかった問題の一部をカバーする価値がある:

  1. $と〜は、$ PATHの値には特別なものではありません。
  2. $ PATHがまったく設定されていない場合、execvp()はデフォルト値を使用します。
関連する問題