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


13

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

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

よろしくお願いします。


回答:


30

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

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

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

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


おもしろいことに、をzsh許可しますが、プロンプト文字列にcd //表示するだけのスマート/です。
new123456

@BinaryZebra Bitsaversには、Apolloを含む古いUnixマニュアルのコレクションがあります-そこにはたくさんの例があるはずです。TUHSのWebサイトにも何かあるはずです。
悲しみ

おかげで、Bitsaversマニュアルに//の説明が見つかりました。

9

POSIXパス名定義から:

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

ソース

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

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


1
問題の動作は2つの先頭のスラッシュに対してのみ表示されるため、より適切なセクションは4.11パス名解決(最後の段落)です。
悲しみ

3

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


1

「バグ」を表示するプロンプトを表示します。

パス "/"、 "//"、 "//////////////////////"、...は同じ意味です: "/"。Unixパスのどこにでも "/"を追加できますが、これは意味を変えません。

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

とにかく面白い;)


同意- //プロンプト内はプロンプト環境変数($PS1)の副作用です-どのようにPS1定義されていますか?
ダグハリス

@DougHarris $PS1変数はとして定義され[\u@\h \W]\$ます。設定に問題はありますか?
-Summer_More_More_Tea

奇数。そのPS1を試してみると/、pwd =のときに1つしか取得できません/。ディレクトリを取得するために余分な作業を行っているのではないかと思いました。されて$PROMPT_COMMAND設定されていますか?
ダグ・ハリス

@DougHarrisはい、この変数は設定されており、その値はecho -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007"です。少し詳しく説明していただけますか?私はこれらの2つの変数にあまり詳しくありません。ありがとう。
Summer_More_More_Tea

bashのmanページを読み、の検索PS1PROMPT_COMMAND-使用しman bashてコマンドラインで、またはオンラインで読む
ダグ・ハリス

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 /

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.