cd ..
と入力してLinuxの上位ディレクトリに戻りたい場合は、cd //
と入力しました。驚いたことに、エラーは報告されていません。さらに、プロンプトはusername@hostname://$
になります。 ls
は、現在ルートディレクトリにいることを示します。
これはバグですか、それともシェルの機能ですか?機能の場合、//
は/
のエイリアスですか?私のシェルはGNU bash、バージョン4.1.5(1)-リリース(i686-linux-gnu)です。
よろしくお願いします。
どちらかと考えることができます。
Linuxでは、//
は何も意味しません–複数の連続するスラッシュは1つに折りたたまれます、どこでもパスの先頭を含みます。ディレクトリを//
に変更すると、/
を実行するとわかるように、readlink /proc/self/cwd
に移動します。同様に、/usr//local///bin
は/usr/local/bin
に折りたたまれます。
ただし、Cygwinや古いApollo Domain/OSなどの他のUnixライクなシステムでは、//
などのネットワークパスに//fileserver/path/to/data
prefixを使用します。 POSIXでもこれが可能です。
さまざまな理由で、bashシェルは(OSが提供する追跡に加えて)現在のディレクトリを独自に追跡し、最初の//
が折りたたまれないようにするコードが含まれています。そのようなシステムとの互換性を維持するため。 「機能」は、bashが現在のディレクトリのより直感的な追跡を提供することです。たとえば、シンボリックリンクにcd
'する場合、bashはカーネルが別の方法で考えている場合でも、期待するパス。 「バグ」とは、それを使用しないシステムでもbashが//
を許可することです。
それは一種の機能です。たとえば、シェルスクリプトを実行してfind
を使用する場合、通常、すべてのパスの前に./が付きます。次に、それを実際のパスに追加すると、 `/my/path/./appended/pathになり、/ my/path/appended/pathに解決されます。したがって、私が間違っていなければ、// getは/./、したがって/として解釈されます。これは、/ home/user //に移動した場合、/ home/user /に移動する場合も同じです。
その機能とすべての複数の//は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 /
「バグ」を表示するプロンプトに行きます。
パス「/」、「//」、「//////////////////////」、...のいずれも同じ意味です:「/」。 Unixパスのどこにでも「/」をいくつでも追加できますが、その意味は変わりません。
「バグ」は、プロンプトが実際の「pwd」ではなく、最後に入力された有効なパスを表示に使用するという事実に関連しています。
とにかく面白い;)