「../」を処理すると、シンボリックリンクが矛盾するようです。

「../」を処理すると、シンボリックリンクが矛盾するようです。

ここで矛盾は次のとおりです。シンボリックリンクプロセス../ディレクトリ2方法:

  • 現在のパスを次のように処理します。結果プリンタpwd
  • 現在のパスを次のように処理します。絶対パス

たとえば、説明します(とてもわかりやすいです)。


次のディレクトリ階層を考えてみましょう。

/tmp/
  |__a/
  |  |__b/
  |
  |__sb=./a/b/ -> /tmp/a/b/  # the name `sb' means symbol b;
                             # `sb' is generated by:
                             # [/tmp/]$ ln -s ./a/b/ sb
  1. _

    [/tmp/]$ cd sb  # `pwd' says we are now in /tmp/
                    # let's change to /tmp/a/b/
    
    [/tmp/sb/]$ cd ../  # Now we are in /tmp/a/b/
                        # But what is /tmp/a/b/'s parent dir?
    
    [/tmp/]$   # See?  We didn't come back to /tmp/a/ BUT /tmp/
    

    これは現在親ディレクトリ右から2番目です。印刷機pwd

  2. 追加しようシンボリックリンクディレクトリを入力します/tmp/a/b/

    /tmp/
      |__a/
      |  |__b/
      |     |__sa=../ -> /tmp/a/  # [/tmp/a/b/]$ ln -s ../ sa
      |
      |__sb=./a/b/ -> /tmp/a/b/
    

    今回は現実に戻ります。親ディレクトリ/tmp/a/b/

    [/tmp/]$ cd sb  # change to /tmp/a/b/
    
    [/tmp/sb/]$ cd sa  # sa=../
                       # /tmp/sb/=/tmp/a/b/
                       #   ^    or     ^
    
    [/tmp/sb/sa/]$ ls --classify
    b/                 # ???
                       # We are now in /tmp/a/ because there is a b/ here!
    

    それでは、なぜ今回は参照を選択したのですか?絶対パス決定親ディレクトリ


それが含まれると矛盾が発生します../が、相対パスが含まれると同じことが起こると思います。

上記のすべての作業はCentOS 7.9でテストされました。

答え1

[/tmp/sb/]$ cd ../  # Now we are in /tmp/a/b/
                    # But what is /tmp/a/b/'s parent dir?

[/tmp/]$   # See? We didn't come back to /tmp/a/ BUT /tmp/ ```

これは、便宜上、シェルがその場所に到達するために使用したパスを覚えているためです。

長いパスをホームディレクトリの短いシンボリックリンクにリンクし、長いパスについて考え直すことなくcd thelinkすぐに移動できるので、便利です。cd ..あるいは、マルチユーザーシステムでは、システム管理者は代わりにこれを実行できますが、ユーザーは必要ありません。知る正しい道。

pwd -Pただし、orを使用すると、cd -Pシェルはこれを無視します。

[/tmp]$ mkdir -p a/b; ln -s ./a/b sb
/tmp$ cd sb
[/tmp/sb]$ pwd -P
/tmp/a/b
[/tmp/sb]$ cd -P ..
/tmp/a$

[/tmp/sb/]$ cd sa  # sa=../
                   # /tmp/sb/=/tmp/a/b/
                   #   ^    or     ^

[/tmp/sb/sa/]$ ls --classify
b/                 # ???
                   # We are now in /tmp/a/ because there is a b/ here!

ここで...シンボリックリンクは、シェルが何を考えているのかわからないカーネルによって解決されます。シェルはまだユーザーが選択したパスを表示し(sb次へsacd ..戻ります/tmp/sb-P.

同様に、外部ユーティリティを実行すると、選択したpwdパスがわからないため、「物理」パスが表示されます。

[/tmp/sb/sa]$ pwd
/tmp/sb/sa
[/tmp/sb/sa]$ pwd -P
/tmp/a
[/tmp/sb/sa]$ /bin/pwd
/tmp/a

ただし、ディレクトリ変更を使用すると、プロンプトに表示されるパスへのシンボリックリンクがcd -P確認されます。pwd

[/tmp]$ cd -P sb/sa
[/tmp/a]$ 

関連情報