ディレクトリシンボルリンク巡回と親ディレクトリについて

ディレクトリシンボルリンク巡回と親ディレクトリについて

ディレクトリがあり、後者が前者へのシンボリックリンクであるとし/dir1ます/dir2/linked

合計をcd実行すると、出力が表示されます。そうすれば服を着るだろう。この動作は以前にあった概念と一致します。しかし、私が理解しているように、すべてのディレクトリの親ディレクトリ()はディレクトリinodeに保存されます(たとえば、物理的にディスクにあります)。明らかにtrueなので、inodeの親ディレクトリは次のようになります。linkedpwd/dir2/linkedcd ../dir2/dir2/linked../dir2/linked/dir1/

状況をさらに複雑にするために、内部的にと/dir2/linkedの出力が異なります! 「物理的」パスを尊重しながらシンボリックリンクパスを尊重するようです。で述べたようにls ..cd .. ; ls .cdlsこの問題しかし、cd -Pこのユースケースが存在します。

man pwd「物理的」および「論理的」作業ディレクトリが記載されていますが、この時点でまだいくつかの質問があります。

  • PWDこの動作は、で説明されているように常に環境変数によって提供されますかman pwd
  • デフォルトcdls両方がシェルコマンド(プログラムではない)の場合、なぜ動作が異なるのですか?
  • 典型的ですか?プログラムPWD(シェルコマンドではありません)物理パスの代わりに使用できますか?実装によって異なることを知っていますが、経験上どのようなルールがありますか?

ベストアンサー1

bashディレクトリに入るためにシンボリックリンクを使用するときは、シンボリックリンクについて「学習」してこの情報を追跡してください。

例では、次のようにしてこれを確認できます。

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

空の変数でbashを起動する必要がありますPWD。それ以外の場合は、そのトリックを使用して「偽の」パスを表示します。

気づくls はい別のプログラムなので、bashは現在のディレクトリにどのように到達したのかわからないので、単にls ..表示されます。本物フォローしているシンボリックリンクに関係なく、親ディレクトリです。

ほとんどのプログラムは環境変数に依存しませんCWD。プログラムの起動方法はさまざまなので、bashシェルを介した方法はそのうちの1つにすぎないので、正しいCWD値を含めることを期待することは信頼できません(CWD実行する前に間違った値を設定してみてくださいbash -c pwd。してください)。

おすすめ記事