シンボリックリンクを相対パスで指定するときの注意点

lnコマンドの注意点

シンボリックリンク相対パスで指定するときは、シンボリックリンクからの相対パスで指定する必要があります。

たとえば

$ ls
dir
entity.txt

entity.txtはテキストファイル、dirディレクト

となってて、dir/ディレクトリの中に、symlinkという名前で、entity.txtを指すシンボリックリンク相対パスで貼りたいときは以下のようにします。

# 正しい例
$ ln -s ../entity.txt dir/symlink

entity.txtdirがあるディレクトリで実行した場合

他のLinuxのコマンドは、今いるディレクトリから指定する場合がほとんどなので、感覚的には

# 間違った例
$ ln -s entity.txt dir/symlink

としたいところですが、これだと「ファイルがありません」と言われてしまいます。

lnコマンドで指定する第一引数(実体ファイル: entity.txt)は、symlinkを貼るディレクトリから見たパスを指定するので、dirディレクトリから一個上のentity.txtなので、../entity.txtが正解です。

第二引数は今いるディレクトリからシンボリックリンクまでのパスなので、特に問題はないかと思います。

回避方法

第一引数がシンボリックリンクから見たパスになっててややこしいので、まずシンボリックリンクを貼るディレクトリに移動しちゃいます。そこから実行すれば「シンボリックリンクから見たパス」と「今いるディレクトリのパス」が一致するので混乱せずに済みます。

あるいは絶対パスを使えば気にすることがなくなります。ただしファイルやディレクトリを移動するとリンクが参照できなくなるので注意です。相対パスで指定した場合も、参照できなくなりますが、相対パスの場合は「実体のあるファイルのパス」と「リンクがあるパス」の相対的な位置関係が崩れていなければそれぞれを移動しても参照できます。

lnコマンドはちょっと注意が必要なコマンドです。

参考サイト: 【ln -s】シンボリックリンクをちゃんと理解―絶対パス 相対パスでのリンク張り