realpath

hadoopシェルスクリプトで,

THIS="$0"
while [ -h "$THIS" ]; do
  ls=`ls -ld "$THIS"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '.*/.*' > /dev/null; then
    THIS="$link"
  else
    THIS=`dirname "$THIS"`/"$link"
  fi
done

何してるのかなと思ったら,シンボリックリンクをたどって,パスを調べてた.


最初はただ$0を絶対パスとかに変換してるんだろと思い込んでいたら*1,よく見るとなぜかwhile しかも -h の判定って何だっけと思ったら,-L と同じでシンボリックリンクか判定するオプションで,シンボリックリンクをたどるからwhile というわけだった.


ということは,Cのrealpath関数と同じようなしてるんだなとか思っていたら,なんとなくシェルスクリプトでrealpathを呼びたくなってしまったw

とりあえず,perlのinline::cを使っちゃえとか思って

$ ln -s mbox mail  
$ perl -M'Inline C=>q{char*r(char*x){static char b[1024];return NULL==realpath(x,b)?x:b;}}' -leprint+r+mail
/root/mbox


ここで,はっとわれに返って,何でHP-UXでInline::CをCPANからインストールして,そのままrootで現実逃避してるん.しかも,readlinkでいいじゃんなどと気がついた...orz

*1:よく自分はそれをやってるから