web-dev-qa-db-ja.com

Linuxではパス `//`はどのディレクトリを表しますか?

cd ..と入力してLinuxの上位ディレクトリに戻りたい場合は、cd //と入力しました。驚いたことに、エラーは報告されていません。さらに、プロンプトはusername@hostname://$になります。 lsは、現在ルートディレクトリにいることを示します。

これはバグですか、それともシェルの機能ですか?機能の場合、///のエイリアスですか?私のシェルはGNU bash、バージョン4.1.5(1)-リリース(i686-linux-gnu)です。

よろしくお願いします。

13

どちらかと考えることができます。

Linuxでは、//は何も意味しません–複数の連続するスラッシュは1つに折りたたまれます、どこでもパスの先頭を含みます。ディレクトリを//に変更すると、/を実行するとわかるように、readlink /proc/self/cwdに移動します。同様に、/usr//local///bin/usr/local/binに折りたたまれます。

ただし、Cygwinや古いApollo Domain/OSなどの他のUnixライクなシステムでは、//などのネットワークパスに//fileserver/path/to/dataprefixを使用します。 POSIXでもこれが可能です。

さまざまな理由で、bashシェルは(OSが提供する追跡に加えて)現在のディレクトリを独自に追跡し、最初の//が折りたたまれないようにするコードが含まれています。そのようなシステムとの互換性を維持するため。 「機能」は、bashが現在のディレクトリのより直感的な追跡を提供することです。たとえば、シンボリックリンクにcd 'する場合、bashはカーネルが別の方法で考えている場合でも、期待するパス。 「バグ」とは、それを使用しないシステムでもbash//を許可することです。

30
user1686

POSIXパス名定義から:

パス名には、オプションで1つ以上の末尾のスラッシュを含めることができます。複数の連続するスラッシュは、1つのスラッシュと同じであると見なされます。

ソース

そして、より正確には、以下の彼のコメントで言及されているように、パス名の解決に関する 4.11章 から:

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

9
Shadok

それは一種の機能です。たとえば、シェルスクリプトを実行してfindを使用する場合、通常、すべてのパスの前に./が付きます。次に、それを実際のパスに追加すると、 `/my/path/./appended/pathになり、/ my/path/appended/pathに解決されます。したがって、私が間違っていなければ、// getは/./、したがって/として解釈されます。これは、/ home/user //に移動した場合、/ home/user /に移動する場合も同じです。

3
Chuck R

その機能とすべての複数の//は1つの単一の/に置き換えられます

最後の例のようなパスを持つ変数がある場合に便利です。したがって、CDでエラーが発生することはなく、ワークスペース変数を変更する必要もありません。

 MY_WORKSPACE =/home/your_username/workspace/
MY_NEW_PROJECT= $ MY_WORKSPACE/my_proj/
cd$ MY_NEW_PROJECT 

プロジェクト変数の完全な内容は次のとおりです。

/ home/your_username/workspace // my_proj /
1
phschoen

「バグ」を表示するプロンプトに行きます。

パス「/」、「//」、「//////////////////////」、...のいずれも同じ意味です:「/」。 Unixパスのどこにでも「/」をいくつでも追加できますが、その意味は変わりません。

「バグ」は、プロンプトが実際の「pwd」ではなく、最後に入力された有効なパスを表示に使用するという事実に関連しています。

とにかく面白い;)

1
Ouki