シンボリックリンクを介してcdすると、pwdが実際のパスではなくシンボリックリンクを表示するのはなぜですか?

シンボリックリンクを介してcdすると、pwdが実際のパスではなくシンボリックリンクを表示するのはなぜですか?

ln -s 1 2ディレクトリ内のディレクトリを指すソフトリンク()を作成し、test()を使用してソフトリンクを開き、cd 2現在のパスを表示しましたpwd。表示されたパスは~/test/2、ではありません~/test/1

ショートカットを使用すると、物理ディレクトリに移動するWindowsなどのオペレーティングシステムではそうではありません。このソフトリンクがLinuxでどのように機能するかは少し混乱しています。これは、のようなショートカットではありませんかWindows?なぜパスではないのですか~/test/1

 $ mkdir test
 $ cd test
 $ mkdir 1
 $ ln -s 1 2
 $ cd 2
 $ pwd
 /home/dazz/test/2

答え1

これは、現在の場所にどのように到達したかを覚えるシェルの機能です。
すでにrealpathインストールされている場合は、次のことができます。

$ realpath 
/home/dazz/test/1

Pythonがある場合はありません。

$ python -c "import os; print(os.path.realpath('.'))"
/home/dazz/test/1

またはreadlink(coreutilsから):

$ readlink -f .
/home/dazz/test/1

または/bin/pwd(シェル組み込みではありませんpwd):

$ /bin/pwd
/home/dazz/test/1

答え2

コントラストpwd/bin/pwd

pwdこれは、シェルがユーザーがどこにいると思うかを知らせる組み込みコマンドです。したがって、シンボリックリンク「ソフトリンク」を物理ディレクトリとして扱います。

/bin/pwd必要に応じて、ファイルシステムツリーに移動して実際の場所を知らせる外部プログラムです/。上向きに移動すると、シンボリックリンクが存在しないため、シンボリックリンクは考慮されません。..

答え3

他の答えはすでに/bin/pwdシェル操作に対処していますbuiltin pwd

上記のWindowsスタイルのシンボリックリンクに従うには、次のようにしますcd -P。これにより、PWD変数が変更されます。

デフォルトで使用するには、次の行をまたは-Pに追加します。.bashrc.zshrc

set -P

他のエンクロージャは異なる場合があります。

関連情報