私はソベルの本を読んでいます。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