ルートフォルダーに入力したcd ..
が警告せず、エラーで失敗するのはなぜですか?
私は期待します:
/$ cd ..
-bash: cd: ..: No such file or directory
代わりに、私は/
に残っています。もちろん、これは..
が/
に存在し、/
と同じように単に.
であるためです。なんでそんな感じなんだろう。
オープングループによると(POSIX標準を担当):
各ディレクトリには、最初のディレクトリの名前dot-dotで表される1つの親ディレクトリがあります。 [...]ファイル名dot-dotがルートディレクトリに関連して参照するものは、実装定義です。バージョン7では、ルートディレクトリ自体を指します。これは、POSIX.1-2008で言及されている動作です。一部のネットワークシステムでは、構造/../ hostname /を使用して別のホストのルートディレクトリを参照し、POSIX.1はこの動作を許可します。
ルートディレクトリのドットドットエントリは、ルートディレクトリ自体を意味すると解釈されます。したがって、ドットドットを使用して、ルートディレクトリをルートとするサブツリー外のファイルにアクセスすることはできません。
/
ディレクトリでさえ実際にはhasが..
の有効なディレクトリエントリであるため、エラーは発生しませんが、他のディレクトリとは異なり、ディレクトリ自体を指し示すため、動作します。 .
と同じ:
$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$
最初の列が示すように、.
、..
、および/
はすべて同じiノード番号を持っているため、同じファイルシステムエントリです。
そのため、あなたがcd ..
の/
の内部にいる場合でも、/
にとどまります。
それを削除するには、カーネルとCライブラリで特別な場合の処理コードを作成する必要があるためです。現在のところ、移動するディレクトリには常に.
と..
があると想定できます。
現在必要な唯一の特殊なケースのコードは、ファイルシステムマウントコードにあります。ルートディレクトリは常にルートディレクトリではないため、コードは..
のiノード値をオーバーライドして、マウントポイントを含むディレクトリをポイントします。
.
の..
および/
が実際に何であるかを確認する別の方法は、次のとおりです。
$ readlink -f ..
/home
$ readlink -f /.
/
$ readlink -f /..
/
ご覧のとおり、.
および..
は/
を指しています。
'..'が/にある別の理由は、それがなかった場合、別の特別なケースが作成されることです。ルートディレクトリには、他のすべてのディレクトリよりもハードリンクが1つ少なくなります(すべてのディレクトリノードにn + 2リンクがあり、nは内部の直接サブディレクトリの数)。これは、ディレクトリスキャンの最適化に依存しているさまざまなプログラムを壊します。
それがそこにあるのは素晴らしいことです。そうしないと、フォルダからルートに到達するために../../../../
をスパムすることができないからです。ルートで..
が許可されなかった場合は、作業ディレクトリの下にあるフォルダーの数を数えるのに行き詰まります。