Unix、「/」と「//」で始まるパスの違い

Unix、「/」と「//」で始まるパスの違い

unix / linuxでは、パス内の連続スラッシュは通常単一のスラッシュと同じです。例えば。

$ cd /home/shum
$ pwd
/home/shum
$ cd /home//shum
$ pwd
/home/shum
$ cd /home///shum
$ pwd
/home/shum

ただし、何らかの理由で絶対パスの先頭にある2つのスラッシュは特別に処理されます。例えば。

$ cd ////home
$ pwd
/home
$ cd ///
$ pwd
/
$ cd //
$ pwd
//
$ cd home//shum
$ pwd
//home/shum

パッチの異なる場所にある他の連続スラッシュは切り捨てられますが、最初の2つのスラッシュは、後でそれに関連するファイルシステムを参照してもそのまま残ります。

なぜこれですか? /...と//...の間に違いはありますか?

答え1

ほとんどの場合、パスで繰り返されるスラッシュは単一のスラッシュと同じです。。この動作はPOSIXで要求され、ほとんどのアプリケーションがこれに従います。例外は、「2つの連続したスラッシュで始まるパス名は、実装で定義されている方法で解釈できます」と同じ///fooです/foo

ほとんどのユニスは、前に2つのスラッシュを使用して特別な操作を実行しません。特にLinuxはそうではありません。 Cygwinが行うこと://hostname/pathネットワークドライブ(SMB)にアクセスします。

実際、ここで見ているのは、Linuxが特別なことをするのではなく、//bashが現在のディレクトリを追跡することです。比較する:

$ bash -c 'cd //; pwd'
//
$ bash -c 'cd //; /bin/pwd'
/

Bashは予防措置を講じており、オペレーティングシステムはこれを//特別に処理して保存することができます。ダッシュも同じことをします。 Ksh と zsh は Linux で実行しても動作しません。 (確認していません)コンパイル時間設定があるようです。

答え2

~からPOSIX仕様:

2つの連続したスラッシュで始まるパス名は実装定義の方法で解釈できますが、2つ以上の先行スラッシュを単一のスラッシュとして扱う必要があります。

私は、Linuxが bash将来この動作を強制的に使用する場合に備えて、この動作を維持すると思います。

(Al ViroがPlan9の機能を使用していたために維持したということをいつも聞いていてLinuxでその機能を持ちたかったのですがPlan9ドキュメントには見つかりません。しかし、そこにあるのでbashAlには何もないかもしれません。それと関連があります)。

答え3

~によるとPOSIXの定義、二重スラッシュ(//)で始まるパスは、「...複数の先行スラッシュは単一のスラッシュとして扱われますが、実装定義の方法で解釈できます。」別の方法で行動する:

% bash -c 'cd //; pwd'
//
% csh -c 'cd //; pwd'
/

Bashはディレクトリを保存しているように見え、pwdは$ PWDを報告し、cshはそのgetcwd()機能を使用して物理ディレクトリを取得するようです。

関連情報