それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ln -s で相対シンボリック作成のやりかたと解説。

ln -s で失敗した経験ありますよね?

/var/www/log/index.php から /var/www/html/index.php へリンクする場合。こういうときに、相対パスをぱぱっと作れたら嬉しいでしょ?

でも、ぱぱっと作れなかったり、相対パスを作ったつもりがリンク切れてたり。。そして、失敗を繰り返してしまう。

最後には、諦めてフルパスでリンク書いてたり。しませんか?

ところが、フルパスだとバックアップフォルダ移動後にリンクが壊れたりする。

相対パスでリンクすると、あとで楽だもんね。

だから基本的に相対パスで書きたいよね?うん。だよね???だよね???

というわけで、相対パスシンボリックリンクの作り方。

お急ぎの人は

記事の最後へどうぞ。

次のようなリンクを作ってみます。

ファイルをリンクする場合に相対パス絶対パスで作ってみます。

絶対パスなら次のように

ln -s /var/www/log/index.php  /var/www/html/index.php

相対パスなら次のように・・・?

ln -s ./index.php  /var/www/html/index.php

ん?相対パスのスタートはどこだ?誰から見た相対パスを入れるんだ?

相対パスは、宛先ファイルから見た相対です。

/var/www/log/index.php から /var/www/html/index.php へリンクする場合。

つまり宛先からみた、相対パスをいれる。

ln -s ../log/index.php  /var/www/html/index.php

相対パスの求め方。

作りたいリンクから見た相対パスを1番目に指定する。

ln -s は2番目の引数を考えてから、1番目の引数を考える。 ところが一般的なコマンドは目的地(2番目)のコマンドの内容を考える。なので、思考のパターンが逆になる。

このへんがいつもわかりにくいミスする原因なんだと思う。

カレントディレクトリ。

ln で作成するリンクのファイルからみて相対パスにカレントディレクトリは考えない。

作成するリンクと、作業中のカレントディレクト

作成するリンクファイルはワーキングディレクトリからの相対パスで指定することが出来る。

cd /var/www/
ln -s ../log/index.php  ./html/index.php

ここで、 次に注意する。

  • ../log/index.php作成するリンクから見た 相対パス
  • ./html/index.php作業ディレクトリからみた 相対パス

引数それぞれで、相対パスの元が異なるの。ここがよくミスしたり誤解が増えるポイントだと思うんですよね。

ポイントのおさらい

  • 第1引数  作成ファイルから見た 相対パス
  • 第2引数 ワーキングディレクトリからみた 相対パス

相対パスの求め方

たとえば realpath を使ってみる。

$ realpath --relative-to=$( dirname /var/www/html/index.php)  /var/www/log/index.php
../log/index.php
$ ln -s ../log/index.php  /var/www/html/index.php

コレらを併せて。

ln -s $(realpath --relative-to=$( dirname /var/www/html/index.php)  /var/www/log/index.php)  /var/www/html/index.php

面倒くさい。

realpath と ln -s を組み合わせるのは本当に面倒くさい

-r オプション最強

この目的のためにあるのが、r オプション

ln -sr で解決

相対パスを自動て解決してくれるのが -r オプション。まじでコレ付けるだけで解決する魔法のオプション

ln -s -r /var/www/log/index.php /var/www/index.php

r 付けるだけ これで今の理屈を全部やってくれる。知らなかったら絶対に損するオプション。

どこで活躍する?

バージョンごとにフォルダ変えたり、dockerfile とか

sites-enablesites-available など 設定ファイルの有効・無効をリンクで切り替える構成にするときにすごく重宝する。

-r オプションが無いんだけど怒!!

そういうときは、困りますよね。 ワーキング・フォルダを移動します。 リンクを作成するフォルダに cd してから相対パスで指定するとうまくいきます。

cd /var/www/html  ## リンク作成するディレクトリへ先にcd します。
ln -s ../log/index.html ./index.html

ディレクトリのリンクの場合も同じです。

関連資料

bashでファイルパスの相対パスを得る(絶対パスの取得やパスの正規化も)/realpath利用 - それマグで!

参考資料

man ln

関連アイテム

ファミコンミニ リンクの冒険

ファミコンミニ リンクの冒険

f:id:takuya_1st:20180225020756p:plain:w200