basyura's blog

あしたになったらほんきだす。

シンボリックリンクのリンクの先のディレクトリを知りたい

/tmp/test.rb を作って

#!ruby
puts __FILE__

~/bin にシンボリックリンクを張る

cd ~/bin
ln -s /tmp/test.rb te

呼び出す

$ te
/home/basyura/bin/te

となるんだけど、ここで /tmp/test.rb を取得するにはどうしたらいいのか?

puts `ls -la #{__FILE__}`.split(" -> ")[1]
#=> /tmp/test.rb

とか?(^ ^;
よく分からないのが

#!ruby
puts __FILE__ #=> /home/basyura/bin/te
puts File::Stat.new(__FILE__).symlink? #=> false

これで symlink? が false を返すんだけどなぜ? cygwin の ln は windows のショートカット扱いだからかなぁと思ったんだけど、ubuntu 環境でも同じ。マニュアルにも

symlink?
シンボリックリンクである時に真

とあるんだけど。そもそもシンボリックリンクの理解が間違ってる?

追記

puts File.symlink?(__FILE__)
#=> true

ってことで File::Stat を使ったのがいけなかったのか。ついでに

puts File.readlink(__FILE__)
#=> /tmp/test.rb

ってしたら、リンク先もとれた。
新しいリファレンスマニュアルにはちゃんと書いてある。

symlink? -> false
シンボリックリンクである時に真を返します。ただし、File::Statは自動的にシンボリックリンクをたどっていくので常にfalseを返します。

instance method File::Stat#symlink?