(1) Linuxでもディストリビューションによってディレクトリ構成(パス構成)はかわります。設計者の趣味…という説は嘘ですが考え方の相違であったり管理ツールの都合であったりさまざまな理由でディレクトリ構成やおいてあるファイルの種類は異なります。
(2)相対パスでアクセスするためです。それ以外に理由はありません。/ではじまらないパス名は相対パス名と呼ばれますが、自分自身と自分の親ディレクトリを示すものがないと、ディレクトリそのものへアクセスができなかったり、直下にないパス(ディレクトリ)の参照ができないので、.. と . が仕様として追加されました。
(3)管理者権限があればディレクトリへのハードリンクをはれます。管理者でないと出来ないようになっているのは、書かれている通り無限ループにおちいる可能性があるため危険な操作を簡単に出来るようにするためです。
(4)ルートは/とするという設計仕様だからです。ルートディレクトリ含めてディレクトリを透過的にあらわすためです。(ルートディレクトリは名無しのディレクトリだと思えば。)
a. 他のホスト上にあるルートディレクトリをNFSで/mnt にマウントする場合を考えてください。
b. 任意のディレクトリは chroot システムコールを使うとそのプロセスからはルートディレクトリに見えます。
おそらく "http://q.hatena.ne.jp"の類推から"//"が気持ち悪いと感じられているのだと思いますが、ここでの"//"はホストを示すものとして扱われています。今ルートディレクトリを"//"と再定義してしまうと"http://q.hatena.ne.jp//index.html" と書かざるをえなくなってしまって大混乱ですよ。ホスト名を"//"で表現するのは大昔の広域ファイル共有システムの表現の名残ですね。
(1) Linuxでもディストリビューションによってディレクトリ構成(パス構成)はかわります。設計者の趣味…という説は嘘ですが考え方の相違であったり管理ツールの都合であったりさまざまな理由でディレクトリ構成やおいてあるファイルの種類は異なります。
(2)相対パスでアクセスするためです。それ以外に理由はありません。/ではじまらないパス名は相対パス名と呼ばれますが、自分自身と自分の親ディレクトリを示すものがないと、ディレクトリそのものへアクセスができなかったり、直下にないパス(ディレクトリ)の参照ができないので、.. と . が仕様として追加されました。
(3)管理者権限があればディレクトリへのハードリンクをはれます。管理者でないと出来ないようになっているのは、書かれている通り無限ループにおちいる可能性があるため危険な操作を簡単に出来るようにするためです。
(4)ルートは/とするという設計仕様だからです。ルートディレクトリ含めてディレクトリを透過的にあらわすためです。(ルートディレクトリは名無しのディレクトリだと思えば。)
a. 他のホスト上にあるルートディレクトリをNFSで/mnt にマウントする場合を考えてください。
b. 任意のディレクトリは chroot システムコールを使うとそのプロセスからはルートディレクトリに見えます。
おそらく "http://q.hatena.ne.jp"の類推から"//"が気持ち悪いと感じられているのだと思いますが、ここでの"//"はホストを示すものとして扱われています。今ルートディレクトリを"//"と再定義してしまうと"http://q.hatena.ne.jp//index.html" と書かざるをえなくなってしまって大混乱ですよ。ホスト名を"//"で表現するのは大昔の広域ファイル共有システムの表現の名残ですね。
(1)と(3)は了解しました。ありがとうございます。
(2)ですが、たとえばディレクトリdir1の下にディレクトリdir2があって、カレントディレクトがdir2だったとします。dir1に移動するとき、cd ..とすればよく、簡単だと思います。でも、「..」という表記がなくともdir2が持っている情報のなかに親ディレクトリとしてdir1という名前が登録されていれば、cd dir1とでも表現できそうなものです。なぜ、直接の名前ではなく、「..」といった表現なのかなあという質問なのでした。
(4)ですが、「透過的」「名無しのディレクトリ」「chrootシステムコール」等不勉強でわからない単語でして、確認させていただきます。質問の趣旨としては、ルートディレクトリを「/」とするのは、それはそのように作られているのだからしょうがありませんが、また一方で区切りとして使うのもよいのですけど、だったらルートディレクトリとその子ディレクトリとの間にも区切りの/を入れて表現してほしいなあ、「/(ルートディレクトリ)/(区切り)home」ならわかるのだけど、なぜ「/home」となるの?というものでした。もしお時間ありましたら再回答をしていただければありがたいです。
(1) Linuxでもディストリビューションによってディレクトリ構成(パス構成)はかわります。設計者の趣味…という説は嘘ですが考え方の相違であったり管理ツールの都合であったりさまざまな理由でディレクトリ構成やおいてあるファイルの種類は異なります。
(2)相対パスでアクセスするためです。それ以外に理由はありません。/ではじまらないパス名は相対パス名と呼ばれますが、自分自身と自分の親ディレクトリを示すものがないと、ディレクトリそのものへアクセスができなかったり、直下にないパス(ディレクトリ)の参照ができないので、.. と . が仕様として追加されました。
(3)管理者権限があればディレクトリへのハードリンクをはれます。管理者でないと出来ないようになっているのは、書かれている通り無限ループにおちいる可能性があるため危険な操作を簡単には出来ないようにするためです。
(4)ルートは"/"とするという設計仕様だからです。ルートディレクトリ含めてディレクトリを透過的にあらわすためです。(ルートディレクトリは名無しのディレクトリ。)
a. 他のホスト上にあるルートディレクトリをNFSで/mnt にマウントする場合を考えてください。
b. 任意のディレクトリは chroot システムコールを使うとそのプロセスからはルートディレクトリに見えます。
おそらく "http://q.hatena.ne.jp"の類推から"//"が気持ち悪いと感じられているのだと思いますが、ここでの"//"はホストを示すものとして扱われています。今ルートディレクトリを"//"と再定義してしまうと"http://q.hatena.ne.jp//index.html" と書かざるをえなくなってしまって大混乱ですよ。ホスト名を"//"で表現するのは大昔の広域ファイル共有システムの表現の名残ですね。
(2)
根っこを表すroots(ルーツ)という言葉。
植物の根は通常1本ではなくて大量にあるので通常使う言葉としては複数形で表しますが
根源という意味で単数形に戻すと root となります。
一番最初に書く / は根源から辿れ(絶対指定や絶対パスなどと表します)という意味となり
一番最初に / が無ければ現在位置から(相対指定や相対パスなどと表します)という意味になります。
相対指定のために現在位置を示す . と親ディレクトリを示す .. が存在するのですが
現在位置からを示す場合 ./ は通常は省略できるようになっているため
./hogehoge ではなく hogehoge と書く場合が殆どだと思います。
省略可能であるという事を意識せず(知らず)に使っている人が大半かと思いますが、
それに気付いたがために意味が判らず「気持ち悪い」となったのでしょう。
# ちなみに「意識せずに(知らず)」が「透過的に」と同じ意味になります。
(4)
途中で使う / はディレクトリとファイル(あるいはサブディレクトリ)との区切りになってますが
上記と違う意味なのに同じ記号が使われているのは
「これらが使われ始めた時代は使える文字の種類が非常に少なかった」のが原因かと思います。
(アルファベット大文字小文字と数種類の記号、制御コードまで含めて128種類)
(1)と(3)
既回答にて納得の様子なので割愛しますね。
ご丁寧な回答、ありがとうございます。(2)に関しては、あるディレクトリがもっている情報として
i-nod番号 ファイル名
10 ..
20 .
30 file1
40 dir3
となっているかと思いますが、これが、
10 dir1
20 dir2
30 file1
40 dir3
となっていないのはなぜなのだろう、という疑問でした。皆さんの回答から、(1)dir1が親ディレクトリである、dir2が自分自身を表す、といった情報を表現しないといけないため、余分な容量が必要となる。(2)「..」「.」と表現したほうが、簡単に相対パスを表現できるため操作性が上がる、と理解しました。
(4)について、なるほど!と思いました。ありがとうございます。
ありがとうございます。
基本的に他の方が答えていますので(1)について補足しておきます。
ファイルシステムの構成は昔はUnix全般で結構色々ありました。
これは歴史的な理由になります。
ここの説明は省略します。それこそUnixの歴史を最初から追わなくてはいけないので…。
そして現在このままでは問題があるということで標準化を行っています。
(コメントでttamoさんが指摘していますが)これがFHS(The Filesystem Hierarchy Standard)という規格です。
http://www.pathname.com/fhs/ がFHSのサイトです。
現在のLinux(おそらくはUnix全般も)はFHSに従っているはずです(100%ではないですが)。
ただし、FHSにもバージョンがありまして、各ディストリビュータがリリースを行うときにFHSのどのバージョンに従うかによってディレクトリ構成が変わってきます。
Linux間でも(もちろんUnix間でも)ディレクトリ構成が異なるのはこういう事情です。
もちろんFHSに従っていない場合もありますのでその辺は仕方が無い部分もあります。
ちなみにLinuxであればmanのhier(7)を参照すれば各ディレクトリの意味が書いています。
>>ttamoさん
>ありがとうございます。(2)について、ちょっと意味がわかりません(笑)。ただ、「すべてをファイルで表現する」という思想があるのですね。参考になりました。
この「すべてをファイルで表現する」というのはまさにUnixの哲学の1つです。
この辺(というか今回の質問全般)を本当に理解するにはC言語でプログラミングを行うしかないと思います。
ありがとうございます。FHS、確認してみます。
すべてをファイルで表現する、というのは、たとえばデバイスもファイルとして扱われている、
というところにもつながっているのでしょうかね。
いま勉強を始めたばかりで、C言語まではまだ追えませんが、意識したいと思います。
(1)と(3)は了解しました。ありがとうございます。
(2)ですが、たとえばディレクトリdir1の下にディレクトリdir2があって、カレントディレクトがdir2だったとします。dir1に移動するとき、cd ..とすればよく、簡単だと思います。でも、「..」という表記がなくともdir2が持っている情報のなかに親ディレクトリとしてdir1という名前が登録されていれば、cd dir1とでも表現できそうなものです。なぜ、直接の名前ではなく、「..」といった表現なのかなあという質問なのでした。
(4)ですが、「透過的」「名無しのディレクトリ」「chrootシステムコール」等不勉強でわからない単語でして、確認させていただきます。質問の趣旨としては、ルートディレクトリを「/」とするのは、それはそのように作られているのだからしょうがありませんが、また一方で区切りとして使うのもよいのですけど、だったらルートディレクトリとその子ディレクトリとの間にも区切りの/を入れて表現してほしいなあ、「/(ルートディレクトリ)/(区切り)home」ならわかるのだけど、なぜ「/home」となるの?というものでした。もしお時間ありましたら再回答をしていただければありがたいです。