私は、バイナリの完全なパス名を見つけるために$ PATHを歩かなければならないCアプリケーションで作業しています。唯一許可されている依存関係はglibcです(つまり、外部プログラムを呼び出すことはありません)。通常の場合、getenv( "PATH")をコロンで分割し、各ディレクトリを1つずつチェックするだけですが、すべての可能なコーナーケースを確実にカバーしたいと思います。私は何を見なければならないのですか?具体的には、〜で始まるパスが$ HOMEに展開されることを意味する相対パス、または:charが含まれるパスが許可されていますか?
答えて
私が驚いたことの1つは、空の文字列がPATH
であることです。現在のディレクトリを意味します。 PATH
の末尾または先頭にある2つの隣接するコロンまたはコロンは、カレントディレクトリが含まれることを意味します。これは例えばman bashに記載されています。
POSIX specificationにもあります。
だから
PATH=:/bin
PATH=/bin:
PATH=/bin::/usr/bin
すべては、私は、これは一般的にLinuxで問題があるわからないんだけど、あなたのコードが動作することを確認してください
PATH
にPATH
は、いくつかのファンキーを持っている場合、現在のディレクトリがあることを意味します(UTF-8のような)エンコーディングを使用して、手紙でディレクトリを処理します。ファイルシステムのエンコーディングに依存する可能性があります。
私は、彼のユーザ名に豪華な手紙を持っていたロシアの男のバグ報告(彼のホームディレクトリ名はPATH
)に取り組んでいました。
いいえ、エンコーディングは 'PATH'とは無関係です。プログラムがそれを考慮すれば、それはバグです。 –
@R:面白い;その主張をサポートするための仕様がありますか?私が理解していることは、 'PATH'を解析するためには(' bytes'のシーケンスではなく)一連の文字として扱わなければならないということです。そのため、エンコーディングを認識する必要があります。 –
'PATH'で特別な文字は': 'だけなので、あなたの主張が妥当性を持つ唯一の時間は、従来のWindows指向のCJKエンコーディングですが、通常Unixでは使用できないと考えられています。 –
これはマイナーですが、まだ言及されていないので追加します。 $ PATHには、絶対パスと相対パスの両方を含めることができます。各ディレクトリにchdir(2)でパスリストをクロールする場合は、クロールの各繰り返しで元の作業ディレクトリ(getcwd(3))とchdir(2)を追跡する必要があります。
既存の答えは、それのほとんどをカバーするが、それはまだ答えていなかった問題の一部をカバーする価値がある:
- $と〜は、$ PATHの値には特別なものではありません。
- $ PATHがまったく設定されていない場合、
execvp()
はデフォルト値を使用します。
- 1. POP3クライアントの開発にはどのようなRFCを考慮する必要がありますか?
- 2. SMTPクライアントの開発にはどのようなRFCを考慮する必要がありますか?
- 3. ジョブショップのスケジューリング:どのソリューションを考慮する必要がありますか?
- 4. Amazon EC2インスタンスの測定パフォーマンスを追跡する際に、ライブマイグレーションを考慮する必要がありますか?
- 5. ドメインモデルの実装でUIプロジェクトタイプを考慮する必要がありますか?
- 6. Amazon Storageに移行するにはどのような要素を考慮する必要がありますか?
- 7. IDisposableを実装する際に考慮するリスクはありますか?
- 8. Linuxでgetpwuid()が返すポインタを解放する必要がありますか?
- 9. php4セーフモードをオフにする - 何を考慮する必要がありますか?
- 10. RegExを使用してテキストを解析しますか?私はこのようになりますテキストから値を解析する必要があり
- 11. Asp.netでの負荷分散、開発中に何を考慮する必要がありますか?
- 12. 統計的な呼び掛けの並列性を考慮する必要がありますか?
- 13. 使用するプロセスを決定する際に人間の要素を考慮する必要がありますか?
- 14. C++で(実際の、適切な、フル機能を備えた)CSVをどのように読み、解析する必要がありますか?
- 15. $ PATHを理解するために何が必要ですか
- 16. なぜZend_Dateは解析時にタイムゾーンのみを考慮に入れますか?
- 17. Androidプラットフォームを利用するにはどのようなパターンを理解する必要がありますか?
- 18. 奇妙なスキーマでXMLを解析する必要がある
- 19. アンドロイドゲーム用の画像を作成するためには、どの解像度の参照を考慮する必要がありますか?
- 20. xmlのように見えるSQLでフィールドを解析する必要があります
- 21. 大きなXMLファイルを解析する必要があります。ベストプラクティス?
- 22. PATHでnvmはrvmの前にある必要がありますか?
- 23. スレッドを起動してXMLを解析する必要がありますか?
- 24. Linuxのsysfsを解析するPythonモジュールはありますか?
- 25. RoRアプリケーション用にMySQLとAmazonのSimpleDBを決定する際に、何を考慮する必要がありますか?
- 26. ウェブサイトの内容を解析するにはどのような一般的なアプローチが必要ですか?
- 27. PHP:openofficeでメールをどのようにマージする必要がありますか?
- 28. これは、UMLクラス図のクラス、または型として考慮する必要がありますか?
- 29. どのようなユーザー名を許可する必要がありますか?
- 30. どのようなVisualStateManagerを使用する必要がありますか?
+1「which」のソースコードを確認した後、これが唯一のコーナーケースであるようです。 ''はフルパスが与えられ、ファイルが実行可能であるかどうか最初にチェックします。次に、パスの各コンポーネントを前に追加し、空のパスコンポーネントを現在のディレクトリに置き換えて再度チェックします。 –
仕様に従って、 'which'の実装といくつかの一般的な標準シェルは、かなり良い見通しを与えるべきです。 – Novelocrat