歴史的な質問です。私はこの質問に対する答えを見つけようとしましたが、運がありませんでした。
すべてのディレクトリに「。」と「..」が含まれ、ROOT(/)にも「..」が含まれています。ところで、なぜそうなのでしょうか?私の限られた観点では、どちらも不要に見えます。
現在のディレクトリでスクリプトを実行します
./script.sh
。しかし、"."が存在しない場合bash script.sh
。親ディレクトリに移動します
cd ..
。しかし、「..」が存在しない場合cd --parent 1
(親ディレクトリに移動)のようなコマンドがある可能性があります。
したがって、点と点は必須ではなく速記のようです。
欠点は、「.」という名前のファイルが生成されないことです。または「..」。また、ドットで始まるファイルを一覧表示/操作する方が難しく、エラーが発生しやすくなります。
rm -r .* # delete current and parent directory?
明らかに言えば、私は変化を求めるものではありません。私たちがどのようにここまで来るのか気になります。この2つのディレクトリを参照する他の方法ではなく、なぜこの選択が行われたのですか?
編集:一部の人々は改善方法についてのフィードバックを提供せずに私の質問に投票しました。
答え1
.
ディレクトリは..
POSIX Unix仕様の一部です。
コマンドなしで動作するようにコマンドを変更することを提案すると、状況がより複雑になります。歴史的な理由もあります。
.
現在のディレクトリを参照する必要がない場合はどうすればよいですか?たぶん空の文字列がありますか?親ディレクトリを使用する..
ことは近道のように見えますが、それを使用しないようにシステムのすべてのコマンドにオプションを追加することも良い解決策ではありません。一部の(歴史的)システムは両方の親...
ディレクトリを参照する必要がありますが、これは単にシェルショートカットです。
ディレクトリ..
は相対パス名に役立ちます。これはコンテンツを移植可能にするのに最適な方法で、フルパス名をハードコーディングするよりも優れています。
通常、この.
ディレクトリは$PATH
。cd
したがって、デフォルトのパスから削除され、現在のディレクトリで何かを実行したい場合./command
。bash command
代わりに、1つではなく2つのプロセスが開始されることを明示的に実行する必要があります。
答え2
現在のディレクトリでスクリプトを実行します
./script.sh
。しかし、"."が存在しない場合bash script.sh
。
はい、しかし正しい通訳が何であるかを知る必要があります。おそらく、誰かがPerlで書き直しましたが、互換性のために名前を保持したか、名前は実際にothertool
は拡張子なしでそのままだったかもしれません。./othertool
システムがhashbang line()を介して問題を処理できるようにするには、これを実行します#!
。あるいは、プログラムがバイナリである可能性があるため、他の魔法の数もあります。もちろん.
に追加することもできますPATH
。
しかし、それは後で考えた合理化です。なぜならハッシュバンラインはそもそも存在したことがないと確信するからです(そして今もPOSIXではありません)。
親ディレクトリに移動します
cd ..
。しかし、「..」が存在しない場合cd --parent 1
(親ディレクトリに移動)のようなコマンドがある可能性があります。
はい、存在するかもしれません。しかし、これは相対パスを使用しようとするたびにさらに難しくなることを意味します。あなたはそのようなことをすることはできません。おそらく、一部のプログラムには、yoursなどのコマンドラインオプションを使用するか、パスの前に付く文字列を介してmv ../foobar/blah .
これを実行する方法が含まれる場合があります。--parent
%up/foobar/blah
同様に、相対シンボリックリンクがツリーのより高いレベルを指すようにすることはできません。/foo/bar/link
先のとがったシンボリックリンクは/foo/other/file
相対参照のみを含むのではなく、名前を指定する必要があります../other/file
。名前を変更するとリンクが壊れたり、foo
名前が変更されたときにこれらのシンボリックリンクを再構築するメカニズムが必要です。
一般的には使用されていませんが、基準ファイルシステムツリーを上に移動する方法は、このようなことをより一般的にし、次のような場合には一般的です。はい必要。
さらに、ファイルシステムが機能するには、特定のディレクトリの親ディレクトリを見つける方法が必要です。cd --parent
単純で明確な実装は、そのディレクトリに関連付けられている他のすべてのディレクトリと同様に、特別な名前を使用してそれらを保存することです。
.
cp /some/where/file.txt .
また、便利なので、特別な方法で「ここ」を参照する必要はありません。たとえば、COPY
DOS / Windowsのコマンドは、デフォルトで現在のディレクトリから始まるGNU findやGNU grepなど、デフォルトで現在のディレクトリをターゲット-r
にしています。しかし、これはまた、すべてのプログラムが現在のディレクトリの特別なケースを持たなければならないことを意味します。
もちろん、名前が完全に異なる場合もあります。たとえば、名前がドットで始まる他のファイルの作成を無効にすることも悪い考えではないかもしれません。あるいは、これらの特殊名に対して特定の文字を予約し、他のファイル名でその文字の使用を完全に許可しないでください。