上の図では、lsがlinkylink / ..が現在のディレクトリと同じではないと考える方法を確認できます。 同時に、cdは彼に同意していないようです。
システムパスのように見えるおなじみのすべてのWebアドレスから話を始めます。
URIパスの2つのポイント(Web上)
ポイントの解釈は、RFC 3986のセクション5.2.4で説明されています 。
次のように機能します。2点の各セグメントは、前のセグメントを破壊します。
/a/b/c/../../g <=> / a / g
同時に、破壊するものがない場合、2つのポイントは無視されます。
example.com/../../../etc/passwd <=> example.com/etc/passwd
ルールは、相対パス(../img/pic.png)がuriコンテキストから絶対プレフィックスに変換できるように考案されました。
- /a/css/index.cssは../img/pic.pngを参照します
- /a/css/index.cssでは、最後のスラッシュ=> / a / css /の後にすべてが破壊されます
- ../img/pic.pngが/ a / css / => /a/css/../img/pic.pngに追加されます
- ポイントが解釈されます=> /a/img/pic.png
これらの操作は通常、相対URIを絶対URIに変換するときにブラウザーによって実行されます。 また、 規格によれば 、uriが絶対uriを含む正規化形式(正規化)に変換されるときに、ポイントを破棄する操作を実行する必要があります。
野生のWebサーバーは、ドットを含む要求に遭遇せず、それぞれが独自の方法でそれらを処理します。
一般に、正規化ルールに基づいて、「http://example.com/a/b/../c」という形式のURIには「b」が存在する必要はありません。
シェル内の2つのポイント
シェルコマンドcdは同様に動作します。2つのポイントは 、サブディレクトリへの前の遷移を元に戻すかのように、 常に上記のパスの1つのセグメントを動作します。 ただし、uriとは異なり、シェルは中間ディレクトリの存在を確認します。
最初のものが自然だと思うなら、この出版物はあなたのためです。 実際、シェルはcdのこの動作をエミュレートします。他のすべての場所で* nix ".."は異なる動作をします。
組み込みのsourceコマンド(またはその同義語 "。")でさえ、cdから優れた動作をします。
違いは、ディレクトリへのシンボリックリンクに現れます。cdの場合、このようなリンクをクリックすると、「..」で元に戻せますが、システムの残りの部分は、リンクが指すディレクトリの物理的な親として「..」
別の方法では、最初の動作は、物理(-P)とは対照的に、論理(pwdおよびcdでは-L)と呼ばれます。
ファイルシステムの2つのポイント
* nixでは、「..」は実際のサブディレクトリであり、シンボリックリンクに依存しない唯一の物理的な親です。 ext2ファイルシステムの内部を見ると、サブディレクトリの説明は「..」と「。」です。 冒頭にリストされていることを除いて、他と異なることはありません。
場合によっては(たとえばFreeBSDで )、この事実は、「..」への連続したジャンプを通じて、作業ディレクトリ(個別に格納されていない)へのパスを計算するためにも使用されます。
パスに沿って進むことは、サブディレクトリに順番に進むことと同じです。
シンボリックリンクを使用してディレクトリにアクセスした場合、返す情報が残っていないことは簡単にわかります。「..」は物理的な親を示します。 しかし、シンボリックリンクを含む論理パスでcdはどのように機能しますか? このため、シェルはカタログに到達したパスを記憶しています。 シェルによって構築された論理パスは、$ PWD環境変数またはpwd [-L]を介してアクセスできます。
特にスクリプトでは、2つの点に注意が必要です。
PS:sysfsにはディレクトリへのシンボリックリンクがたくさんあります:
バグ@地球/ sys /クラス/ネット/ lo%ls addr_assign_typeフラグphys_port_id アドレスgro_flush_timeout phys_switch_id addr_len ifalias power ... バグ@ earth / sys / class / net / lo%ls .. ロ バグ@地球/ sys /クラス/ネット/ lo%pwd -P; pwd -L / sys /デバイス/仮想/ネット/ lo / sys /クラス/ net / lo バグ@ earth / sys / class / net / lo%cd ..; ls eth0 lo