tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

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

はじめに

linuxコマンドのlnについてのおはなし
特に相対パスでのシンボリックリンクについて。

普通にシンボリックリンク

シンボリックリンクはこんな説明が多い

ln -s リンクされるfile(or dir)パス リンク名称

ぜんぜんそうだね、と思ってたけど相対パスでのシンボリックリンク時につまづいた。

自分がよく使うのはこんな感じ

ln -s /tmp/anydir1/anydir2 /home/hoge/anydir2

理解してなかったのは相対パスシンボリックリンクを貼るとき。

相対パスでのシンボリックリンク

ファイルの構成がこんな感じだったとして。。。

# tree ./lntest/
./lntest/
└── projectDir
    └── dirA
        ├── dirB
        ├── dirC
        │   └── dirD
        │       └── dirE ←ここにdirGへのシンボリックリンクを相対パスで作る
        └── dirG
            └── sample.txt

今、dirBにいるとします。
dirE以下にdirGへのシンボリックリンクln_dirGをおきたい場合、
絶対パスなら前述のように普通にやればいい。

相対パスなら?
自分はてっきりこんな感じだと思ってました。

# pwd
$HOME/lntest/projectDir/dirA/dirB

# ln -s ../dirG ../dirC/dirD/dirE/ln_dirG

つまり、
ln -s (dirBから見たリンクされるパス) (dirBからみたシンボリックリンクパス)

でも、結果はこうなります。

# pwd
$HOME/lntest/projectDir/dirA/dirB

※ シンボリックリンク作成&移動
# ln -s ../dirG ../dirC/dirD/dirE/ln_dirG
# cd ../dirC/dirD/dirE

※ 一応確認
# pwd一応確認
$HOME/ntest/projectDir/dirA/dirC/dirD/dirE

※ どんな感じか確認
# ls
lrwxrwxrwx 1 hoge hoge    7 11月 29 22:22 ln_dirG -> ../dirG

# cd ln_dirG
cd: そのようなファイルやディレクトリはありません: ln_dirG

なんでやねん...orz
合ってると思い込んでたので何がいけないかを小一時間悩んだ結果わかりました。


ln -s リンクされるfile(or dir)パス リンク名称
っていうのは
ln -s リンク先からリンク元へのパス リンクの名称
と表現されたり、もっと簡単に言えば
ln -s シンボリックリンクからのパス シンボリックリンクのパス
ってことか。。。と。


手動でやるときは絶対パスでいいですけど
フォルダが変わっても実行できるような汎用的なシェルスクリプトでやりたかったので変数にいれたり相対にする必要があってハマりました(><)


知ってる人、慣れてる人には何言ってんの?当たり前じゃん的かもしれませんがぜんぜん気づかなかったorz...

ということで、正しい貼り方はこうなります

# pwd
$HOME/lntest/projectDir/dirA/dirB

※ 第一引数には作るシンボリックリンクから見た「../../../dirG」を指定&移動
※ ちなみにtabでの保管できません(コマンドライン的にはdirBから見てるので)
# ln -s ../../../dirG ../dirC/dirD/dirE/ln_dirG
# cd ../dirC/dirD/dirE

# pwd
$HOME/lntest/projectDir/dirA/dirC/dirD/dirE

※ リンクを確認
# ls 
lrwxrwxrwx 1 hoge hoge    7 11月 29 22:22 ln_dirG -> ../../../dirG

※ リンクから移動してsample.txtが見えるか試す
# cd ln_dirG
# pwd
$HOME/lntest/projectDir/dirA/dirC/dirD/dirE/ln_dirG

# ls -l
sample.txt

たいてい絶対パスだけでやってたからとは言え、合ってると思い込むと平気で小一時間時間使ってしまいますね...

ってか、もし相対での説明をするならリンク元とかリンク先とかややこしいから「シンボリックリンクからのパス」と言って欲しいですねw

おわりに

ほとんど愚痴ひとりごとですが、
「リンク先」という言葉だけ使って説明してしまうと(どこかのサイトでありました)
実ファイルから見ると作ったシンボリックは「リンク先」(リンクした先)っぽいし
作ったシンボリックリンクからするとリンクしてる実ファイルも「リンク先」(リンクの先)っぽいし
これって結局書く人がどっちから見たかで「リンク先」の言葉ちがくね?って思ってひとりで勝手にイラつきましたw


実際検索で探してみると
ln -s [リンク先ファイル] [リンクファイル]
って書いてあるところもあれば
ln -s [リンク元ファイル] [リンクファイル]
って書いてあったり
ln -s [リンク元ファイル] [リンク先名称]
とあったりややこしいw