web-dev-qa-db-ja.com

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つ残ります。

どうしてこれなの?/...と// ...の間に違いはありますか?

57
Shum

ほとんどの場合、 パスで繰り返されるスラッシュは単一のスラッシュと同等 です。この動作はPOSIXによって義務付けられており、ほとんどのアプリケーションがそれに準じます。例外は、「2つの連続するスラッシュで始まるパス名は、実装定義の方法で解釈される可能性がある」ということです(ただし、///foo/fooと同等です)。

ほとんどのuniceは、2つの最初のスラッシュで特別なことは何もしません。特にLinuxはそうではありません。 Cygwinは次のことを行います://hostname/pathはネットワークドライブ(SMB)にアクセスします。

あなたが見ているのは、実際、Linuxが//で特別なことをしているわけではありません。これは、bashの現在のディレクトリトラッキングです。比較:

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

Bashは、OSが//を特別に扱い、保持する可能性があるという予防策を講じています。ダッシュも同じです。 KshとzshはLinuxで実行している場合はそうしません。私はチェックしていませんが)コンパイル時の設定があると思います。

POSIX仕様 から:

2つの連続するスラッシュで始まるパス名は、実装定義の方法で解釈される場合がありますが、2つ以上の先行スラッシュは単一のスラッシュとして扱われます。

私が想定し Linuxbashは、将来的に使用する必要がある場合に備えて、この動作を維持します。

(Al Viroがそれを使用するPlan9の機能があるため、Al Viroがその機能を維持しているといつも聞いていましたが、Linuxでその機能を使用したいと思っていますが、Plan9のドキュメントでその機能を見つけるのに苦労しています。しかし、代わりにbashにあるため、Alはおそらくそれとは何の関係もありません。)

21
sarnold

POSIX定義 に従って、ダブルスラッシュ(//)で始まるパス "...は、実装で定義された方法で解釈される場合がありますが、2つを超えるスラッシュは1つとして扱われます。スラッシュ。」たとえばcshを使用する場合、同じようには動作しません。

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

Bashはディレクトリを格納しているようで、pwdは$ PWDを報告していますが、cshは実際のディレクトリを取得するためにgetcwd()関数を使用しているようです。

9
jsbillings

後続の複数のスラッシュはすべて無視され、単一のスラッシュとして扱われます。

開始時でも、2つを超えるスラッシュは無視され、単一のスラッシュとしてのみ扱われます。

先頭のダブルスラッシュ(//)は、ルート/ディレクトリも意味しますが、pwdを実行すると、CWDは//として表示されます。

次のコマンドは、///と同じルートディレクトリであることを確認します

$~> cd /
$/> pwd
/
$/> stat -c "%i" .
2
$/> cd //
$//> pwd
//
$//> stat -c "%i" .
2

inode numberはどちらの場合も2であるため、どちらも同じディレクトリです。

1
anubhava