web-dev-qa-db-ja.com

シンボリックリンクの解決(pwd)

次のようにするとします。

cd /some/path
ln -s /target/path symbolic_name

もしそうなら:

cd /some/path
cd symbolic_name
pwd

私は得ます:

/some/path/symblic_name

ではなく:

/target/path

シェルがシンボリックリンクを "完全に解決"する方法(つまり、CWDの更新など)があります。

cd /target/path

ターゲットパスに到達する方法について「認識」または「敏感」に見えるいくつかのプログラムを実行する必要があります。また、ターゲットパスに到達したかのようにcd /target/path 直接。

36

シェルには組み込みのpwdがあり、「スマート」にしようとします。 cdをシンボリックリンクにした後、内部のpwdは、実際のディレクトリに移動したかのように出力を偽装します。

-Pオプションをpwdに渡します。つまり、pwd -Pを実行します。 -Pオプション(「物理」用)は、シンボリックリンクの追跡を行わず、ディレクトリへの「実際の」パスを表示しないようにpwdに指示します。

あるいは、この種の魔法を実行しない(そして実行することさえできない)リアルバイナリpwdも存在する必要があります。そのバイナリを明示的に使用するだけです:

$ type -a pwd
pwd is a Shell builtin
pwd is /bin/pwd
$ mkdir a
$ ln -s a b
$ cd b
$ pwd
/home/michas/b
$ /bin/pwd
/home/michas/a
42
michas

cd -P <symlink_dirname>をお試しください。

tim@ls:~$ mkdir a
tim@ls:~$ ln -s a b

tim@ls:~$ cd b
tim@ls:~/b$ pwd
/home/tim/b

tim@ls:~/b$ cd ..
tim@ls:~$ cd -P b
tim@ls:~/a$ pwd
/home/tim/a

set -o physicalを使用して、実行中のシェルの存続期間を通じてこの動作を持続させることもできます。

より良い情報については、 https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links をチェックしてください。

13
livingstaccato