パス構文規則


10

Unixパス文字列を操作するためのライブラリを書いています。そういうわけで、私はほとんどの人が気にしないであろう構文のいくつかのあいまいなコーナーを理解する必要があります。

たとえば、私が知る限りfoo/barfoo//bar両方とも同じ場所を指しているようです。

また、~通常はユーザーのホームディレクトリを表しますが、パスの途中にある場合はどうでしょうか。次に何が起こりますか?

考えられるすべてのケースを正しく処理するコードを記述しようとする場合、これらとその他の数十のあいまいな質問に答える必要があります。誰かがこのものの正確な構文規則を説明する決定的なリファレンスを知っていますか?

(残念ながら、「Unixパス構文」のような用語を検索すると、$PATH変数を説明する100万ページが表示されます...ヘック、この質問に適したタグを見つけるのに苦労しています!)


ok〜tildeと-filenameの展開は、UNIX環境のPOSIX定義の機能の基礎となっています。いくつかのヒント:ファイル名は\ 0または/ 以外でもかまいません。//////と/は同じものです。$ PWDはカーネルで処理され、/ proc内の任意の(Linux)プロセスで読み取ることができます。/./はパスのルートでのみ発生します。$ PATH :::::と:は同じものです。/ dev / null / dev / ttyおよび/ tmpは、すべての準拠システムのPOSIX保証パスです。
mikeserv 2014

1
あなたの質問のほとんど(に関する部分ではありません~)は、Linuxが複数のパス区切り文字をどのように処理するか(/ home //// username /// file)で説明されています。規範的な参照に最も近いものはPOSIXまたはSingle Unix仕様でしょう-簡単に読むことはできません。
ジル「SO-停止されて悪」

回答:


13

パスには次の3つのタイプがあります。

  • 相対パスが好きfoofoo/bar../a.。それらは、で始まらず/、そのパスを使用してシステムコールを作成するプロセスの現在のディレクトリに対して相対的です。
  • 絶対パスは次のように//foo/barまたは///x。それらは1または3以上/で始まり、相対ではなく、/ルートディレクトリから検索されます。
  • POSIXでは//foo特別な扱いが可能ですが、その方法は指定されていません。一部のシステムでは、ネットワークファイルなどの特別な場合にそれを使用します。スラッシュは2つでなければなりません。

開始時を除いて、スラッシュのシーケンスは1つのように機能します。

~シェルにとって特別なだけで、シェルによって拡張されます。システムにとって特別ではありません。展開方法はシェルに依存します。シェルは、グロビング(*.txt)や変数展開/$foo/$barなど、他の形式の展開を行います。システムに関する限り~foo_fooまたはのような相対パスfooです。

心に留めておくべきこと:

  • foo/と同じではありませんfoo。ほとんどのシステムのほとんどのシステムコールでは(特にシンボリックリンクの場合)foo/.よりも近くなります(と同じです)。foofoofoo//foo/
  • a/b/../cは必ずしも同じではありませんa/c(たとえば、a/bがシンボリックリンクの場合)。..特別な扱いをしないのが最善です。
  • a/././././b同じように考えるのが一般的に安全a/bです。

つまり、要約すると、シェルパス操作(広大で複雑)を気にしない場合、気にする必要があるのは/.および..(?)
MathematicalOrchid

処理の例は//fooCygwinで、UNCパスに使用されます。つまり、//server/share/dir/file.txtはデフォルトでシステム外を指す正当なパスです。Cygwinは、ローカルシステムが見つからない場合にフォールバックしますserver
ウォーレンヤング14

3

たとえば、私が知る限り、foo / barとfoo // barはどちらも同じ場所を指しているようです。

はい。これはよくあることです。ソフトウェアは、最初の部分がスラッシュで終了していないと想定してパスを連結する場合があるため、確認のために1つスローされます(つまり、2つ以上になる場合があります)。foo///barそしてfoo/////barまた同じ場所を指していますfoo/bar。パス操作ライブラリの便利な機能は、任意の数の連続するスラッシュを1つに減らすものです(パスの先頭、ただしURLのように使用できる場合、またはStephaneが指摘するように、不特定の特別な目的)。

また、通常〜はユーザーのホームディレクトリを表します

その変換は、シェルとチルダの拡張を介して行われます。これは、パスの最初の文字である場合にのみ機能します。これに対処する必要があるかどうかは、状況によって異なります。たとえば、パスを含むコマンドライン引数を受け取る通常のプログラムでライブラリを使用する場合、パスが表示されたときにチルダ展開が既に行われています。テキストファイルから直接パスを処理している場合、それが問題であると私が見ることができる唯一の状況です。

それ以上~は、* nixパス内の正当な文字であり、他のものに変更しないでください。このあたり、UNIXのファイル名で法的でない文字だけである/(それがあるので、パス区切り文字)と「ヌル」彼らは一般的にテキストでは無効なので(別名。ゼロバイト)。


チルダ展開の説明については+1。あなたがそれで他のユーザーを参照できるとは思いもしませんでした!
MathematicalOrchid

2
ステファンが言うように、繰り返されるすべてのスラッシュを盲目的に折りたたむことはできません。パスの先頭にある複数のスラッシュは慎重に扱う必要があります。
ウォーレンヤング14

@WarrenYoungこれを明確にするために編集されました。PS。フォワード??!O_O
goldilocks

これはURLとは何の関係もないとは言えませんが。UNCは1980年代後半に遡りますが、URLは数年後まで表示されませんでした。
ウォーレンヤング14

@WarrenYoung公正ですが、UNC はMSプラットフォーム固有であるように思われますが//技術的にもそうではありません。URLと、SCによる新しい、あいまいなPOSIX仕様の両方がそのようなものから派生している// 可能性があります。意図的ではありません)。私は「それらはURLである」とは決して言いません。それは単に「URLっぽい」目的を果たしている、//またはそれを\\ 果たしているだけです。
goldilocks 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.