ファイルのリンクがさらに別へのリンクだったり、チェックするのはちょっと大変
リンク先が、更にリンクだったりして、、、、結構わけわからん。
さらに、リンク先が正しいかどうかをチェックしたり、不正に書き換わってないか調べるのはもう頭割れそうになる。
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"
これで楽ができそう。