シンボリックリンクと相対パス の組み合わせでハマったこと


例えばこんなディレクトリ構成があるとします

tmp / c ( a/b へのシンボリックリンク)
 | / 01.txt ( "tmp/01.txt" )
 |
 +- a / 01.txt( "tmp/a/01.txt" )
    |
    +- b / 01.txt( "tmp/a/b/01.txt" )


んで、シンボリック c から、tmp/01.txt を読み込みたいので、以下のように、相対パスでファイルを読みだしてみる

irb(main):001:0> File.open('./c/../01.txt'){ |f| f.read }
=> "/tmp/a/01.txt\n"

すると、/tmp/a/01.txt が読み出されている!


こういう場合、expand_path を挟んであげると、シンボリックリンク以降の相対パスも好意的に解釈してくれるようです

irb(main):001:0> File.open(File.expand_path('./c/../01.txt')){ |f| f.read }
=> "/tmp/01.txt\n"


Linux の仕様なのか、ruby の仕様なのかは不明
どっかにこの辺の仕様について言及したドキュメント無いかしら?