Linuxでは、すべてのエンティティがFILEと見なされます。 vim <cd-Name>
を実行した場合 次に、vim
ファイルとディレクトリを区別しないため、ディレクトリのコンテンツをエディタで開きます。
しかし、今日、仕事をしているときに、知りたいことがありました。
ネストされたディレクトリからファイルを開く予定でした
vim a/b/c/d/file
ただし、vim
の代わりに 、入力しました
cd a/b/c/d/
TABを押します 2回ですが、コマンドはファイルではなく「d」ディレクトリの使用可能なディレクトリのみを表示していました。
cd
はしないでください コマンド名誉「すべてがファイルです 「?それとも何かが足りないのですか?
承認された回答:
「すべてがファイルです 」というフレーズは、オペレーティングシステムのアーキテクチャを定義します。これは、プロセス、ファイル、ディレクトリ、ソケット、パイプなど、システム内のすべてが、カーネルの仮想ファイルシステム層上に抽象化されたファイル記述子によって表されることを意味します。仮想ファイルシステムは、カーネルによって提供されるインターフェースです。したがって、フレーズは「すべてがファイル記述子です」と修正されました。 「。 Linus Torvalds自身が、もう少し正確に修正しました。「すべてがバイトのストリームです 「。
ただし、すべての「ファイル」には、通常のファイルとディレクトリから知っている所有者と権限もあります。したがって、cat、ls、ps、…などの従来のUnixツールは、これらすべての「ファイル」をクエリできます。すべてread()
を使用する単純な古いツール以外に、他の特別なメカニズムを考案する必要はありません。 システムコール。たとえば、Microsoft OSファミリには、複数の異なるread()
があります。 任意のファイルタイプに対するシステムコール(15について聞いた)であり、それらはすべて少し異なります。すべてがファイルの場合、それは必要ありません。
質問へ :もちろん、さまざまなファイルタイプがあります 。 Linuxには7つのファイルタイプがあります。ディレクトリはその1つです。ただし、ユーティリティはそれらを互いに区別できます。たとえば、cd
の完全な機能 コマンド( TABを押したとき )stat()
であるため、ディレクトリのみが一覧表示されます システムコール(man 2 stat
を参照) )st_mode
というフィールドを持つ構造体を返します 。 POSIX標準は、そのフィールドに含めることができるものを定義します。
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
cd
コマンド補完関数は、S_ISDIR
が存在する「ファイル」を表示するだけです。 フラグが設定されています。