それマグで!

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

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

Symbolic Link のリンク先を取得したり、最終的なリンク先を取得したり

ファイルのリンクがさらに別へのリンクだったり、チェックするのはちょっと大変

リンク先が、更にリンクだったりして、、、、結構わけわからん。

さらに、リンク先が正しいかどうかをチェックしたり、不正に書き換わってないか調べるのはもう頭割れそうになる。

takuya@atom:~$ ls -l    /usr/lib/x86_64-linux-gnu/libcurl.so*
lrwxrwxrwx 1 root root     17 12月 30  2014 /usr/lib/x86_64-linux-gnu/libcurl.so -> libcurl-gnutls.so
lrwxrwxrwx 1 root root     12 12月 30  2014 /usr/lib/x86_64-linux-gnu/libcurl.so.3 -> libcurl.so.4
lrwxrwxrwx 1 root root     16 12月 30  2014 /usr/lib/x86_64-linux-gnu/libcurl.so.4 -> libcurl.so.4.2.0
-rw-r--r-- 1 root root 431272 12月 30  2014 /usr/lib/x86_64-linux-gnu/libcurl.so.4.2.0

ファイルの最終的なリンク先を取得する realpath

リンクの先を取得して、更に取得して、最終的なファイルを読み込むのがreadlink

takuya@atom:~$ realpath  /usr/lib/x86_64-linux-gnu/libcurl.so.3
/usr/lib/x86_64-linux-gnu/libcurl.so.4.2.0

これで、Pathがわかるんだけど、リンク先だけが欲しい時に困るよね。

あと、realpathはインストールされてなかったりする。

ファイルの指している先を取得する readlink

takuya@atom:~$ readlink  /usr/lib/x86_64-linux-gnu/libcurl.so.3
libcurl.so.4

ただし、readlink -f をしちゃうとrealpath と変わらなくなる。 readlink だと、フルパスがわからなくので、困る・・・

realpath の代替としての readlink -f

takuya@atom:/var/www $ readlink -f /usr/lib/x86_64-linux-gnu/libcurl.so.3
/usr/lib/x86_64-linux-gnu/libcurl.so.4.2.0

realpath はユーザ空間、 readlink はシステム標準なので、どこでも使えるのは readlink

takuya@atom:/var/www$ which readlink
/bin/readlink
takuya@atom:/var/www $ which realpath
/usr/bin/realpath

ruby でヤったばあい。

ruby には File.expand_pathがあって、もう少し便利かもしれない。

File.realpath

File.realpath "/usr/lib/x86_64-linux-gnu/libcurl.so.3" #=> "/usr/lib/x86_64-linux-gnu/libcurl.so.4.2.0"

File.readlink + File.expand_path

path_str = "/usr/lib/x86_64-linux-gnu/libcurl.so.3"
File.expand_path( File.readlink(path_str), path_str) #=> "/usr/lib/x86_64-linux-gnu/libcurl.so.3/libcurl.so.4"

これで楽ができそう。