
私はUnixパス文字列を操作するためのライブラリを作成しています。そのため、私はほとんどの人が心配しない文法のあいまいな部分を理解しなければなりませんでした。
たとえば、私が知っている限り、と両方がfoo/bar
同じfoo//bar
場所を指しているようです。
また、~
通常はユーザーのホームディレクトリを表しますが、真ん中パス?それではどうなりますか?
すべての可能な状況を正しく処理するコードを書くには、これらの質問や他の何十ものあいまいな質問に答える必要があります。説明する明確な参照を知っている人はいますか?精密これに関する文法的な規則は何ですか?
(残念ながら、「Unixパス構文」などの用語を検索すると、その変数について説明するページは100万ページしか表示されません$PATH
...一体私はこの質問に適したタグを見つけるのに苦労しています!)
答え1
パスには3つのタイプがあります。
foo
相対パスは、、、、foo/bar
と../a
同じです。システム呼び出しにパスを使用するプロセスの現在のディレクトリから始まら.
ず、そのプロセスの現在のディレクトリに基づいています。/
- 絶対パス(たとえば
/
、/foo/bar
または)///x
。 1または3以上で始まり、/
相対的ではなく、検索はルートディレクトリから始まります/
。 - POSIXは特別な処理を許可します
//foo
が、方法を指定しません。一部のシステムでは、ネットワークファイルなどの特別な場合に使用します。。正確に2つのスラッシュでなければなりません。
一連のスラッシュは、始めを除いてスラッシュと同じ効果を持ちます。
~
シェルのみ特別、これはシェルによって拡張され、システムにまったく特別ではありません。拡張方法はシェルによって異なります。シェルは、ワイルドカード(*.txt
)や変数の拡張/$foo/$bar
などの他の形式の拡張を実行します。システムに関する限り、これはor~foo
のような相対パスです。_foo
foo
覚えておくべきこと:
foo/
と同じではありませんfoo
。ほとんどのシステムでは、ほとんどのシステムコールの場合(特にシンボリックリンクの場合)foo/.
に近い(thoughと同じ)。foo
foo
foo//
foo/
a/b/../c
必ずしも同じである必要はありませんa/c
(たとえば、ifはa/b
シンボリックリンクです)。..
特別な治療を受けないことが最善です。- 一般的に言えば、
a/././././b
同じことを考えるのは安全ですa/b
。
答え2
たとえば、私が知っている限り、foo / barとfoo / / barは両方とも同じ場所を指しているようです。
はい。これは、ソフトウェアが時々最初の部分がスラッシュで終わらないと仮定してパスを接続するので、確認するために1つが追加されるため、一般的です(2つ以上になることを意味します)。foo///bar
そしてfoo/////bar
のような場所を指すfoo/bar
。パス操作ライブラリの良い機能は、連続スラッシュ数を1つに減らすことです(URLと同じように使用できるパスの先頭を除いて、またはStephaneが指摘したように、指定されていない特殊目的のため)。 。
また、 ~ は通常ユーザーのホームディレクトリを表します。
変換はシェルを介して行われます。チルダ拡張、パスの最初の文字の場合にのみ機能します。これを処理する必要があるかどうかは状況によって異なります。たとえば、パスを含むコマンドライン引数を受け取る一般的なプログラムでライブラリを使用する場合、チルダ拡張は次のようになります。もう終わった彼らがその道を見るとき。注意を払う価値があると思われる唯一のケースは、テキストファイルから直接パスを処理することです。
それ以外の場合は~
*nix パスで有効な文字なので、他のものに変更しないでください。 〜のようにこれによると、Unixファイル名で許可されていない唯一の文字は/
(パス区切り文字であるため)と「null」(別名0バイト)です。通常、テキストでは許可されていないためです。