私は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
。