Googleでこれについていくつか調査しましたが、結果は曇っていました。/
ルートディレクトリを示すために記号が使用されるのはなぜですか。その背後にある確かな理由はありますか?
/some/dir
ALWAYSは(root)/some/dir
、while some/dir
が常に現在の作業ディレクトリに対して相対的であることを意味します。この原則は、Web URLの使用にも移行できます。
Googleでこれについていくつか調査しましたが、結果は曇っていました。/
ルートディレクトリを示すために記号が使用されるのはなぜですか。その背後にある確かな理由はありますか?
/some/dir
ALWAYSは(root)/some/dir
、while some/dir
が常に現在の作業ディレクトリに対して相対的であることを意味します。この原則は、Web URLの使用にも移行できます。
回答:
スラッシュ/
は、UNIXライクなオペレーティングシステムのパスでディレクトリを区切る区切り文字です。このキャラクターは1970年代に選ばれたようです。逸話的な情報源によると、その理由は、Unixの前身であるMulticsオペレーティングシステム>
がパス区切り文字としてこのキャラクターを使用したことと関係があるかもしれませんが、Unixのデザイナーはすでに予約していたマルチレベルのファイルシステムを使用するかなり前に、シェルコマンドラインで文字>
と<
I / Oリダイレクトを示します。そのため、ファイルシステムを設計するときが来たとき、パス名要素の分離を示す別の文字を見つける必要がありました。
ここで注意すべきことは、1970年代に一般的に使用されていたLear-Siegler ADM-3A端末では、特にホームディレクトリを表す文字を使用する慣習が~
起源であり、/キーはキーの隣にあるということ>です。
ルートディレクトリが単一/
で示される理由については、ルートディレクトリがディレクトリ階層の最上位ディレクトリであり、他のディレクトリがその下にある可能性があるという事実に影響される可能性が最も高い慣習です。ルートディレクトリ以外の何かを参照する理由。同様に、ディレクトリエントリ自体には名前がありません。これは、表示可能なディレクトリツリーの境界であるためです。
/
。Unixファイルシステムは、さまざまなドライブのマウントポイントを持つ単一のツリーです。
chroot
、そのようなものがあります- 新しいルートの外にアクセスすることはできませんが、それはそこにないという意味ではありません。
chroot()
導入された時点では、jailのようなプロパティはまったくなく、パス名の解決にのみ影響していました。今日でも、特権プロセスは 設計によりchrootから抜け出すことができます。以前のコメントchroot()
でも言及しました。
>
、ディレクトリセパレータとしてだけでなく、<
親ディレクトリを参照するために:<
単独で同等であった..
一方で、<foo
同等でした../foo
。私はいつもそれが美的に楽しいと感じました。
今日知っている最初の階層ファイルシステムは、Multics用に設計されました。この設計については、RC DaleyとPG Neumannによる「2次ストレージ用の汎用ファイルシステム」で説明されています。このファイルシステムの顕著な特徴は、ディレクトリが他のファイルのようにディレクトリに含まれることができるファイルであることです。ファイル構造はツリーを形成し、非リーフノードはすべてディレクトリです。ツリーのルートは常にディレクトリです。各ファイルには、その親ディレクトリ内で一意の名前(エントリ名)があります。ルートディレクトリは別のディレクトリに含まれていないため、名前はありません。
ファイルを指定するには、ツリーのルートからのパスを記述する必要があります。Multicsは、パス名に自然な構文を採用しました。ここで、P
はディレクトリへのパスF
であり、ファイルの名前である場合、パスがであるディレクトリ内で呼び出されるファイルの構文です。P>F
F
P
ディレクトリに負担をかけたくないときのために、Multicsには作業ディレクトリという概念がありました。ディレクトリを指定しない裸のファイル名は、作業ディレクトリ内のファイルとして解釈されます。
これらの規則を組み合わせたものfoo
が、作業ディレクトリ内のファイルです。作業ディレクトリのfoo>bar
子ディレクトリfoo
にあるファイルなどです。これらのルールは相対パスを記述しますが、ルートディレクトリから始まる絶対パスを構築するには補足ルールが必要です。左から右へのパス名の読み取りは、ツリーのルートからリーフへの移動に対応するため、ルートはパス名の左側にある特別なマーカーで示す必要があります。ファイル名は決して空ではないため(多くの場合、混乱を招く可能性があるため)、文字>
で始まる相対パス名は存在せず、絶対パス名の便利なマーカーになります。このように>foo
呼ばれるファイルされるfoo
ルートディレクトリには、>foo>bar
と呼ばれるファイルであるbar
というディレクトリにfoo
ルートディレクトリなどに。これにより、空の文字列であるルートディレクトリが残ります。ただし、空の文字列をパス名として使用するのは不便なことが多いため、代わりに書き込まれます>
。これには、パス名が最初の文字がの場合にのみ絶対であるという追加の利点があり>
ます。
Unixはこの設計をMulticsから採用しました。Unixはすでに>
コマンドシェルで出力のリダイレクトにこの文字を使用していたため、デザイナーは/
パス名のディレクトリを分離するために別の文字を選択しました。
Unix上のパス名コンポーネントでは、2文字のみを使用できません。C(カーネルの言語)で文字列を終了するヌル文字と、パス区切り文字として予約されているスラッシュです。さらに、パスコンポーネントを空の文字列にすることはできません。
そのため、パス名には、スラッシュとコンポーネントの2種類のトークンしかありません。
、と仮定し、新しいトークンを追加することなく、我々は、相対パスと絶対パスのサポート2種類をサポートしたいと思います。さらに、名前のないルートディレクトリを参照できるようにしたいと思います(名前を付ける親はありません)。
スラッシュのみを使用して、相対パス、絶対パスを表現し、ルートディレクトリを参照するにはどうすればよいですか?
言語を拡張する最も明白な方法(新しいトークンの導入以外)は、新しい構文を作成することです。無効な構文であるトークンの組み合わせに新しい意味を与えます。
スラッシュで始まるパスは意味をなさないため、「このパスは相対ではなく絶対であること」を示すマーカーとして先頭のスラッシュを使用しないでください。
スラッシュのみを含むパスも無効なので、「ルートディレクトリ」という意味を割り当てないでください。
絶対パスがルートディレクトリで検索を開始するため、これら2つの意味は結びつきます。つまり、先頭のスラッシュは次の意味を持っていると見なすことができます。
次に、最後のスラッシュをスローすることもできます。これは、「このパスは、最後のパスコンポーネントが通常のファイルやその他のタイプのオブジェクトではなくディレクトリの名前であることを表明します。先頭のスラッシュがルートディレクトリを示す方法。」
上記のすべての構文では、未割り当ての意味を持つ構文がまだあります:ダブルスラッシュ、トリプルスラッシュなど。
なぜ別のトークンを導入して、異なる方法でそれをしないのか。これはおそらく、設計者が最小限のアプローチを一般的に採用したためです。(なぜ、何か間違ったことをしているときにed
のみエディターに表示されるの?
ですか?)スラッシュは入力しやすく、シフトを必要としません。2つのトークンタイプ(コンポーネントとスラッシュ)のみを持つパス言語は、覚えやすく使いやすいです。
もう1つの重要な考慮事項は、文字列表現のみを使用してパスを簡単に操作できることです。たとえば、新しい親ディレクトリへの絶対パスを簡単に「ルート変更」できます。
OLD_PATH=/old/path
NEW_HOME=/new/home
NEW_PATH="$NEW_HOME$OLD_PATH" /new/home/old/path
これは、先頭のドル記号などの別の方法で絶対パスを指定した場合は機能しません。
OLD_PATH=^old/path # ^ means absolute path
NEW_HOME=^new/home
# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"
Unixスタイルのパスを扱う場合には、このタイプのコーディングが必要な場合がありますが、それはあまりありません。
/
、右足で入力できる「ペダル」キーボードがあると思います。ピアノを弾くようなものです。
cd /home
にcd /home/
追加するのと同じように、ルートディレクトリ自体は名前がない/
ため、そのディレクトリへのアクセスを提供するためです。