一方向のシンボリックリンクを作成したい。つまり、それを使用して宛先ディレクトリに移動できるが、元に戻せない。
D
という名前のディレクトリがあり、2つのサブディレクトリS1
とS2
があるとします。 S1
を指すリンクをS2
に作成したい(ls2 -> ../S2/
としましょう)。 cd ls2
を実行し、次にcd ..
を実行した場合、S1
ではなくD
に移動します。
出来ますか?
すべてのシンボリックリンクは一方向です。カーネルに関する限り、_/D/S1
_に入ってchdir("ls2")
を実行すると、_/D/S2
_にいるので、chdir("..")
を実行すると、終了します_/D
_で上昇します。
シェルでこれを行うと、後
_cd /D/S1
cd ls2
cd ..
_
最終的に_/D/S1
_になります。その理由は、シェルが現在のディレクトリを独自に追跡し、シンボリックリンクを記憶しているためです。
このシェルの動作をリンクごとに無効にすることはできませんが、cd
コマンドを実行するときに無効にすることができます。 _cd ls2
_を実行すると、シェルは現在のディレクトリを_/D/S1/ls2
_として記憶します。
_$ pwd
/D/S1
$ cd ls2
$ pwd
/D/S1/ls2
$ cd ..
$ pwd
/D/S1
_
シェルにシンボリックリンク対応の現在のディレクトリトラッキングを忘れるように指示するには、_-P
_オプションをcd
に渡します。 pwd
コマンドには、_-P
_オプションもあります。
_$ pwd
/D/S1
$ cd ls2
$ pwd
/D/S1/ls2
$ pwd -P
/D/S2
$ cd -P ..
$ pwd
/D
_
また、シンボリックリンクに変更すると、論理追跡を忘れることがあります。
_$ pwd
/D/S1
$ cd -P ls2
$ pwd
/D/S2
$ cd ..
$ pwd
/D
_