私はソベルの本を読んでいます。Linux コマンド、エディタ、およびシェルプログラミングに関する実用ガイド、4e。以前、彼は作業ディレクトリと作業ディレクトリの親ディレクトリの「パス名の同義語」について話してい.
ました。..
私の質問は、それを相対パス名または絶対パス名の同義語と見なす必要があるかどうかです。最後に、私の誤解は、Linuxシステムがパス名を解決する方法を理解していないことに関連していると思います。
例: 次のコマンドを入力したとします。
cd ..
現在の作業ディレクトリの親ディレクトリの絶対パス名を..に変更することでシェルを処理する必要がありますか?それとも、相対パス名を指定すると、「解像度」は異なる動作をしますか(ここではスラッシュ/でパスを開始しないためです)。ある意味、この質問は「すべての相対パス名が適切な絶対パスに置き換えられているため、相対パスの命名は絶対パスの命名の特別なケースですか?」として定式化できると思います。
答え1
.
..
これは、作業ディレクトリと作業ディレクトリの親ディレクトリの「パス名同義語」であることを意味します。
これは単純化です。これはほとんどの場合に当てはまりますが、必ずしもそうではありません。ほとんどの場合、現在のディレクトリが次の場合/one/two/three
と同じで、同じcd .
です。同様に、 と同等で同等です。cd /one/two/three/.
cd /one/two/three
cd ..
cd /one/two/three/..
cd /one/two
ls .
ls /one/two/three
ls ..
ls /one/two
同等性はシェルに依存しません。これは.
トラブルシューティングの重要な作業の一部です..
。歴史的に.
は..
実際には一般的なディレクトリエントリであり、カーネルにはパスナビゲーションでこれらのエントリを処理するコードがありませんでした。.
との唯一の特別なコードは、..
すべてのディレクトリに自動的に生成され、変更または削除できないことです。最新のシステムはディレクトリエントリを保存しない傾向がありますが、代わりにパスナビゲーションコードで特別な処理機能を使用します.
。..
外部コマンドにパスを渡しても、シェルが問題を解決できないことを確認できます.
。..
$ echo ..
..
$ ls ../s*
../somefile ../someotherfile
上記のように、相対パスをチェックすることは、ほとんどの場合、絶対パスを指定するのと同じですが、すべてではありません。たとえば、次のようなアプリケーションを実行できます。
ディレクトリとファイルを作成します。
drwx------ 4 root root 4096 Jan 1 12:00 /some drwx------ 2 myapp root 4096 Jan 1 12:00 /some/where -rwx------ 1 myapp root 4096 Jan 1 12:00 /some/where/myfile
ルートとしてディレクトリに変更します
/some/where
。ユーザーの権限を放棄します
myapp
。アプリケーションは
myfile
andにアクセスできますが、閲覧する権限がないため、orには./myfile
アクセスできません。/some/where/myfile
../where/myfile
/some
.
これは、ファイル以外のファイルへのパス間の同等性に関する一般的な制限です..
。
..
シェルによって内部的に処理される特別な場合があります。cd
コマンド(および関連コマンド、たとえばpushd
)の場合、シェル自体は/dir/..
何も圧縮されません。これには、cd ..
現在のディレクトリをシェルのように処理することが含まれます。これは一般的に人間にとってより優しいと考えられています。具体的には、フォローアップで開始した場所に戻ることができます。これはシンボリックリンクに関して意味があります。同じディレクトリのサブディレクトリへのシンボリックリンクの場合、現在のディレクトリではありません。そのディレクトリの親ディレクトリです。cd /one/two
/one/two/three
cd foo
cd ..
link
link/..
ターゲットのlink
。これを「論理」カレントディレクトリトレースと呼び、一部のシェルでシェルオプションを有効または設定して、「物理」カレントディレクトリトレース(シェルが特別な処理を行わない..
)に切り替えることができます。cd -P
答え2
私の質問は、これを相対パス名または絶対パス名の同義語と見なす必要があるかどうかです。
このステップをスキップして、他のディレクトリのようにまっすぐに考えることをお勧めします。はいあなたに関連するすべての方法で(あなたがカーネルまたはファイルシステムモジュール開発者でない場合)
Gilesの答えは素晴らしく、特に間違ったことはありません。
つまり、「.」を見ることは確かに可能で便利です。そして「..」は湿地標準ディレクトリです。スクリプトやアプリケーションで何をしても、ディレクトリのように動作します(Gilesが言ったように、過去のある時点では実際にディレクトリでした)。
最も重要なのは、コンセプトを維持しなければならないということです。インデックスノードとは別にディレクトリエントリあなたの心の中に。 inodeは、ファイルシステムに「何か」が保存される場所(かなり物理的な方法、つまりディスクブロック)を記述します。これディレクトリエントリ人間が読める名前、対応する索引ノード、属性、日付などを含むより抽象表現です。
ㅏ目次これらの項目をリストするためのいくつかの表現を含む内部処理ファイルであれば、それ自体は問題がないかもしれません(もちろんこれは単純化されました)。重要なのは実際の状況です。保存関連情報がある場所と非常に分離されているどこ保存されました。
次のように入力すると、そのディレクトリのinode(最初の列)が表示されます。
~/tmp$ ls -ilaO
total 8
16326296 drwxr-xr-x 8 me staff - 256 Jan 15 14:02 .
1129613 drwxr-xr-x+ 112 me staff - 3584 Jan 19 17:25 ..
16326815 drwxr-xr-x 2 me staff - 64 Jul 27 2020 a_directory
126333718 -rw-r--r-- 1 me staff - 0 Jan 15 14:07 a_file
tmp
「上階」に移動すると、親ディレクトリにどのように表示されるかを確認できます。
~$ ls -ilaO -d tmp
16326296 drwxr-xr-x 8 me staff - 256 Jan 15 14:02 tmp
tmp
予想通り、親ディレクトリのinは.
insideと同じinodeを指しますtmp
。
.
親ディレクトリを確認してください。
~$ ls -ilaO -d .
1129613 drwxr-xr-x+ 112 me staff - 3584 Jan 19 17:25 .
これは、親ディレクトリの inode が.
期待どおりにサブディレクトリエントリの inode と同じであることを示しています。..
システムの他のディレクトリ名を使用できるほぼすべての場所でおよびを使用できます.
。..
とにかく、私が使用するコマンドが何らかの理由で(たとえば、セキュリティ上の理由で - Webサーバーがパスに絶対に含まれないように強制し、..
誰かがセキュリティルールを「エスケープできない」ように)特別なロジックを実装して何かを入力するためです。 。パスワードファイルを取得するには、URL http://domain/index.html/../../../../etc/passwd と同じです。
他のプログラム(例:)bash
には、特別なマジックハンドル「..」があるかもしれません。たとえば、bashを実行すると、cd ..
現在のパスでは/where/i/was/before/..
ないことがわかります/where/i/was
。これはシェルについて考える方法に関する質問に対する答えです。シェルが達成したいと思うことを行うことで、より簡単にすることを想像できます。特別なロジックを持たない他のプログラムは..
通常、パス内のどこでも簡単に..
動作することができ、幸いにもそれを認識しません。..
はい他のパス名と同じパス名です。
答え3
.
..
カーネルで解析が行われます。パスをたどると、カーネルは dnode エントリを初期化します。現在のディレクトリdnodeエントリには、親ディレクトリdnodeエントリへのポインタがあります。
ご覧のとおり、ファイルシステムコードはここでは何もしません。他の場所で参照するためにディレクトリ..
エントリを破損した場合、実際にこのコンテンツを表示する唯一の方法は、直接作成したNFSv2クライアントを介してです。これはとても本当です。ファイルシステムが破損し、ディレクトリへのパスが2つある場合でも、それはうまく機能し、入力したパスに..
従います。
一部のシェルは、パスcd ..
から最後のコンポーネントをテキストとして削除し、特別な処理を実行します。これは、現在のディレクトリパスがシンボリックリンクの場合に異なる動作を引き起こします。シェルは、どの引数がファイル名引数であり、..
globパターンではないかを知りません。echo ..
これは、返された結果を実行して観察すると簡単にわかります。
出典:修士論文ファイリングシステムを開発しました。