ディレクトリシンボリックトラバーサルと親ディレクトリについて


9

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

ときにあなたがcdするlinkedpwd、あなたは出力を得ます/dir2/linked。その後cd ..、あなたは着られるでしょう/dir2。この振る舞いは、あなたが/dir2/linked以前にいたという概念と一致しています。ただし、私が理解しているように、..任意のディレクトリの親ディレクトリ()は、ディレクトリiノード(つまり、物理的にディスク)に格納されています。明らかに、/dir2/linkedは本当になので/dir1、iノードの親ディレクトリは/

さらに複雑な問題に、内部ながら/dir2/linked、の出力ls ..とはcd .. ; ls .異なっています!cdシンボリックリンクされたパスを尊重しているように見えますが、ls「物理的な」パスを尊重しています。ただし、この質問で述べたようにcd -P、このユースケースにはあります。

man pwd 「物理」および「論理」作業ディレクトリについて言及していますが、この時点ではまだいくつか質問があります。

  • PWD述べたように、この動作は常に環境変数によって提供されman pwdますか?
  • それらが両方ともシェルコマンド(つまり、プログラムではない)である場合、なぜデフォルトcdls動作が異なるのですか?
  • 一般的なプログラム(シェルコマンドではない)PWDは、物理パスの代わりに使用しますか?実装次第だと思いますが、経験則はありますか?

1
内の情報の多くは、この答え
ステファンChazelas

1
@StéphaneChazelasそれは素晴らしい答えです、共有してくれてありがとう
goncalopp

どういたしまして。自分の質問に自分で答えるつもりなら、そこから自由にテキストをコピーして貼り付けてください。
ステファンChazelas

回答:


5

bash シンボリックリンクについて「認識」し、シンボリックリンクを使用してディレクトリに入るときにこの情報を追跡します。

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

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

空のPWD変数でbashを開始する必要があります。そうでない場合は、そのトリックを使用して「偽の」パスを表示します。

ls ある独立したプログラムと、あなたは、現在のディレクトリに到着したかのbashのの知識を持っていないなどがそうls ..ちょうどの内容が表示されます本当の親ディレクトリは、シンボリックリンクに対する相対ではないあなたは続きます。

ほとんどのプログラムは、環境変数に依存しませんCWD、それは期待する信頼性がありませんので、bashシェルが一つだけある経由でプログラムを開始する多くの方法があるとして、CWD正しい値が(設定してみ含むようにCWD実行する前に、何かが間違っにbash -c pwd、あなたはそれを見ることができますチェック健全性の値)。


あなたがそのようにクリアすることを知っていることは有用ですPWDが、これだけでは私が言及した質問に答えません
goncalopp

いくつかの情報を追加しました。
ウルテル、2015年

私はlsbashから提供されたという印象を受けていましたが、helpそれ以外の場合はあなたを確信しました。これにより、状況がより明確になります。ありがとうございます。
goncalopp 2015年

PWDPOSIXの標準です。あなたはそれが設定されることを信頼することができます。これが設定されていない場合、たとえばpwd ユーティリティなどが壊れる可能性があります。「環境変数」も参照してください。
darkfeline 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.