Ubuntuでは、次のコマンドはファイルシステムの見かけ上別の場所に移動しますが、これらの場所に同じファイルがあることを確認しました。
cd /
cd //
両方の位置で ls-ing すると、同じ結果が生成されます。
vm@virtual-machine://$ ls
bin dev initrd.img lib64 mnt root snap sys var
boot etc initrd.img.old lost+found opt run srv tmp vmlinuz
cdrom home lib media proc sbin swapfile usr
一見違うのですが、同じファイルパスの動作に違いはありますか?
注: " cd ///
"は有効なファイルパスではありませんが、 " //usr/
"と " //bin/
"は有効です。注 2: したがって、
すべてのポイントで自分自身を指す cd .. を実行します。// -> cd .. -> //
/ -> cd .. -> /
答え1
POSIX仕様によると、次から始まるパスは正確に2つのスラッシュ実装によって定義されたセマンティクスがあります。
パス内の複数のスラッシュは単一のスラッシュに縮小されます。とは別に状況によっては正確に2つスラッシュは次の位置にあります。始まりに過ぎないパス。
したがって、、、、等/foo
は同じ経路を保証し、、、等は同じ経路を保証する///foo
が、////foo
///////////////////foo
/foo/bar
/foo//bar
/foo///bar
/foo
//foo
いいえ同じパスが保証され、どちらも同じではありません//foo
。///foo
すべての実装は必要に応じてセマンティクスを定義できます。それらできる選択定義は と と同じ意味を持ちますが、//foo
同じではありません。/foo
///foo
〜しなければならない。
これは、オペレーティングシステムが.で始まるパスを使用して、//
POSIXファイルシステムの意味とは異なる意味を実装できることです。
たとえば、WindowsとUnixの仮想ミックスを//
Windowsファイルシステムセマンティクスに使用できます。 Cygwinは、実際に//
Windowsで使用されているものと同様のネットワークパスで動作します\\
。
たとえば、Cygwinでは、cd //; ls
ルートディレクトリではなくローカルネットワーク上のすべてのSMBファイルサーバーが一覧表示されます。