hnwの日記

シェルスクリプトでシンボリックリンク先が同一かチェックする方法

シェルスクリプト中でシンボリックリンクのリンク先を比較したい -OKWave」というページを見つけたんですが、もっとスマートに出来る気がしたので紹介します。どうやら-ef演算子が利用できるようです。(確証は無いのですが、私の手近では反例を見つけられませんでした)

$ touch a b; ln -s a c ; ln -s c d
$ ls -lai [abcd]
188974 -rw-r--r-- 1 hanawa hanawa 0 2009-01-05 03:52 a
188976 -rw-r--r-- 1 hanawa hanawa 0 2009-01-05 03:52 b
188977 lrwxrwxrwx 1 hanawa hanawa 1 2009-01-05 03:52 c -> a
188978 lrwxrwxrwx 1 hanawa hanawa 1 2009-01-05 03:52 d -> c
$ if test a -ef c ; then echo "same file" ; fi
same file
$ if test a -ef d ; then echo "same file" ; fi
same file
$ if test c -ef d ; then echo "same file" ; fi
same file
$ if test b -ef d ; then echo "same file" ; fi
$


ここで利用している-efは下記のような演算子です。(bashのman pageより)

file1 -ef file2
True if file1 and file2 refer to the same device and inode numbers.


inode番号を比較するらしいのですが、どうやらシンボリックリンク自体のinode番号ではなく、シンボリックリンクを辿った先の実体のinode番号を比較するようです。


たまたま手元の実装がそういう挙動だっただけなのか、違う挙動の環境もあるのかはわかりません。そもそも、由緒正しいshが標準装備しているのかも僕は情報を持っていません。ただ、Ubuntu8.04とMacOS10.5のshでも上記と同じ挙動でした。


配布するようなシェルスクリプトでもこの-efの挙動を仮定して大丈夫なのでしょうか。どなたか資料をお持ちの方は教えてもらえると嬉しいです。