ディレクトリには、現在のディレクトリと親ディレクトリへのハードリンクとディレクトリが.
含まれています。..
もしそうなら、シェルは現在のディレクトリの名前が "a"であることをどのように(例えばプロンプトで)知ることができますかcd a/path/..
?専用ケースありますか?
..
そうでなければ、その立場では、このディレクトリが上記のディレクトリでもあるとは知らず、ただというディレクトリに入ることになるのではないだろうか。名前をどうやって知ることができますか?
答え1
foo
あなたの質問は、bashが作業ディレクトリが(代わりにfoo/bar/..
)あるようにディレクトリを変更する方法を知っていると仮定しますcd foo/bar/..
。
どちらのパスも同じ inode で表示されますが(この回答の最後に示すようにパスにシンボリックリンクがない場合)、シェルは現在のディレクトリ名を代わりに表示するために特別なアクションを取る必要がありfoo
ます..
。では、 bash
pathでcd
見つかったときに内部的に親ディレクトリを削除します。つまり、ディレクトリ名にすることはできません。..
..
これに関する文書は次のとおりですhelp cd
。
..
直前のパス名コンポーネントをスラッシュまたはDIRの先頭に戻して処理します。
この特別な大文字と小文字を区別すると、次のような興味深い動作が発生します(実際のパスであってもfoo/qux/..
まだ次のように見えます)。foo
bar/baz/..
$ tree
.
|-- bar
| `-- baz
`-- foo
3 directories, 0 files
$ ln -s "$(readlink -f bar/baz)" foo/qux
$ tree
.
|-- bar
| `-- baz
`-- foo
`-- qux -> bar/baz
4 directories, 0 files
$ cd foo/qux/..
$ basename "$(pwd)"
foo
答え2
あなたが言ったように、これは親..
ディレクトリへのハードリンクです。シェルはディレクトリにアクセスするときにディレクトリ名を知る必要はありません..
。単にinodeを介してディレクトリにアクセスします。
inodeは、ファイル名(タイプ、権限、所有者、グループ、サイズ、アクセス/変更/変更/削除数、リンク数、属性、ACL、およびリポジトリ)を除いて、ファイル(またはディレクトリ)のすべてのメタデータを格納する構造です。です。実際のファイルコンテンツ(データなど)のアドレス。