ルートディレクトリが/記号で示されるのはなぜですか?


95

Googleでこれについていくつか調査しましたが、結果は曇っていました。/ルートディレクトリを示すために記号が使用されるのはなぜですか。その背後にある確かな理由はありますか?


12
その理由は、「/」がディレクトリ区切り文字であり、空の名前の最後cd /homecd /home/追加するのと同じように、ルートディレクトリ自体は名前がない/ため、そのディレクトリへのアクセスを提供するためです。
SF。

2
これを読みましたか:en.wikipedia.org/wiki/Root_directory
Kevdog777

11
内側から見ると、目に見えるディレクトリツリーの境界であるため、名前はありません。表示されるディレクトリ階層は、chroot()呼び出しによってパス名の検索が変更された場合など、より大きな階層のサブツリーにすぎない場合がありますが、内部から見ると抽象化されます。
トーマスナイマン

14
空の文字列は恐ろしい選択だったからです!
バクリウ

3
言及されていることに加えて、ルートを示すために/を使用すると、絶対パス名と相対パス名に関して特定の副作用が生じます。/some/dirALWAYSは(root)/some/dir、while some/dirが常に現在の作業ディレクトリに対して相対的であることを意味します。この原則は、Web URLの使用にも移行できます。
Torヴァラモ

回答:


108

スラッシュ/は、UNIXライクなオペレーティングシステムのパスでディレクトリを区切る区切り文字です。このキャラクターは1970年代に選ばれたようです。逸話的な情報源によると、その理由は、Unixの前身であるMulticsオペレーティングシステム>がパス区切り文字としてこのキャラクターを使用したことと関係があるかもしれませんが、Unixのデザイナーはすでに予約していたマルチレベルのファイルシステムを使用するかなり前に、シェルコマンドラインで文字><I / Oリダイレクトを示します。そのため、ファイルシステムを設計するときが来たとき、パス名要素の分離を示す別の文字を見つける必要がありました。

ここで注意すべきことは、1970年代に一般的に使用されていたLear-Siegler ADM-3A端末では、特にホームディレクトリを表す文字を使用する慣習が~起源であり、/キーはキーの隣にあるということ>です。

Lear-Siegler ADM-3A端末のキーボードレイアウト

ルートディレクトリが単一/で示される理由については、ルートディレクトリがディレクトリ階層の最上位ディレクトリであり、他のディレクトリがその下にある可能性があるという事実に影響される可能性が最も高い慣習です。ルートディレクトリ以外の何かを参照する理由。同様に、ディレクトリエントリ自体には名前がありません。これは、表示可能なディレクトリツリーの境界であるためです。


2
「他のディレクトリがその下にある場合もありますが、通常はルートディレクトリ外の何かを参照する理由はありません。」これはわかりません。「下」がどの方向を意味するのかわかりませんが、にマウントされた階層の「外側」には何もありません/。Unixファイルシステムは、さまざまなドライブのマウントポイントを持つ単一のツリーです。
アレクシス

4
またchroot、そのようなものがあります- 新しいルートの外にアクセスすることはできませんが、それはそこにないという意味ではありません。
ボブソン

1
@Gilles、ドライブの物理的な場所は問題ではありません。任意のディスクパーティションは、その意味でルートパーティションの外にあるが、それが搭載されているのファイルシステム階層のルート。ボブソン、chrootについての良い点ですが、トーマスが言ったことには合いません。それは不可能だ。Unixでは、ファイルシステムのすべてがルートの下にあります。
アレクシス

1
「chrootの後、システムルートの外に出るのは「通常は理由がない」ということではありません。それは不可能です。」これは明らかに間違っています。chroot()導入された時点では、jailのようなプロパティはまったくなく、パス名の解決にのみ影響していました。今日でも、特権プロセス 設計によりchrootから抜け出すことができます。以前のコメントchroot()でも言及しました。
トーマスナイマン

4
IIRC、Multicsの規則を使用するだけでなく>、ディレクトリセパレータとしてだけでなく、<親ディレクトリを参照するために:<単独で同等であった..一方で、<foo同等でした../foo。私はいつもそれが美的に楽しいと感じました。
マークリード

55

今日知っている最初の階層ファイルシステムは、Multics用に設計されました。この設計については、RC DaleyとPG Neumannによる「2次ストレージ用の汎用ファイルシステム」で説明されています。このファイルシステムの顕著な特徴は、ディレクトリが他のファイルのようにディレクトリに含まれることができるファイルであることです。ファイル構造はツリーを形成し、非リーフノードはすべてディレクトリです。ツリーのルートは常にディレクトリです。各ファイルには、その親ディレクトリ内で一意の名前(エントリ名)があります。ルートディレクトリは別のディレクトリに含まれていないため、名前はありません。

ファイルを指定するには、ツリーのルートからのパスを記述する必要があります。Multicsは、パス名に自然な構文を採用しました。ここで、PはディレクトリへのパスFであり、ファイルの名前である場合、パスがであるディレクトリ内で呼び出されるファイルの構文です。P>FFP

ディレクトリに負担をかけたくないときのために、Multicsには作業ディレクトリという概念がありました。ディレクトリを指定しない裸のファイル名は、作業ディレクトリ内のファイルとして解釈されます。

これらの規則を組み合わせたものfooが、作業ディレクトリ内のファイルです。作業ディレクトリのfoo>bar子ディレクトリfooにあるファイルなどです。これらのルールは相対パスを記述しますが、ルートディレクトリから始まる絶対パスを構築するには補足ルールが必要です。左から右へのパス名の読み取りは、ツリーのルートからリーフへの移動に対応するため、ルートはパス名の左側にある特別なマーカーで示す必要があります。ファイル名は決して空ではないため(多くの場合、混乱を招く可能性があるため)、文字>で始まる相対パス名は存在せず、絶対パス名の便利なマーカーになります。このように>foo呼ばれるファイルされるfooルートディレクトリには、>foo>barと呼ばれるファイルであるbarというディレクトリにfooルートディレクトリなどに。これにより、空の文字列であるルートディレクトリが残ります。ただし、空の文字列をパス名として使用するのは不便なことが多いため、代わりに書き込まれます>。これには、パス名が最初の文字がの場合にのみ絶対であるという追加の利点があり>ます。

Unixはこの設計をMulticsから採用しました。Unixはすでに>コマンドシェルで出力のリダイレクトにこの文字を使用していたため、デザイナー/パス名のディレクトリを分離するために別の文字を選択しました。


11

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スタイルのパスを扱う場合には、このタイプのコーディングが必要な場合がありますが、それはあまりありません。


8
「スラッシュは入力しやすく、シフトは不要です。」池の向こう側で簡単に降りることができるかもしれませんが、フィンランドではここでシフトを押すだけでなく、数字の列全体に 手を伸ばす必要があります。; P
トーマスナイマン

1
@ThomasNymanおそらく、外国のキーボードレイアウトはおそらくケントンプソンにとって関心事ではなかったでしょう。Unixの開発者とその初期ユーザーにとって、スラッシュは簡単に入力できました。
カズ

1
けっこうだ。私はほとんど冗談を言っていましたが、現代のハードウェアの特殊性によって、長い遺産持つソフトウェアの特殊性が どのように説明できるのか、興味深い(そして時々面白い)ことがわかりました。
トーマスナイマン

@ThomasNymanハハ、ビル・ジョイ自身がログインしてそのADM-3Aページの{citation-needed}部分を更新すると、「Wikidickhead」が「この記事にはオリジナルの研究が含まれています」と反論するでしょうか。:)
カズ

@ThomasNyman、今/、右足で入力できる「ペダル」キーボードがあると思います。ピアノを弾くようなものです。
パセリエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.