web-dev-qa-db-ja.com

一方向のシンボリックリンクを作成できますか?

一方向のシンボリックリンクを作成したい。つまり、それを使用して宛先ディレクトリに移動できるが、元に戻せない。

Dという名前のディレクトリがあり、2つのサブディレクトリS1S2があるとします。 S1を指すリンクをS2に作成したい(ls2 -> ../S2/としましょう)。 cd ls2を実行し、次にcd ..を実行した場合、S1ではなくDに移動します。

出来ますか?

7
WYSIWYG

すべてのシンボリックリンクは一方向です。カーネルに関する限り、_/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
_