web-dev-qa-db-ja.com

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

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

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

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

これは、シェルが現在の場所に到達した方法を記憶するシェルの機能です。
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
19
Anthon

pwd/bin/pwdを比較してください。

多くのシェルの組み込みコマンドであるpwdは、シェルがどこにいるかをシェルに伝えます(したがって、シンボリックリンクの「ソフトリンク」を実際のディレクトリのように扱います。

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

8
roaima

他の回答は/bin/pwdとシェルのbuiltin pwdをカバーしています。

前述のWindowsスタイルのシンボリックリンクをたどる場合は、cd -Pを使用します。これにより、PWD変数がそれに応じて変更されます。

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

set -P

他のシェルは異なる場合があります。

6
David Lord