From: KOSAKI Motohiro Date: 2010-03-07T01:59:48+09:00 Subject: [ruby-dev:40568] Re: [Bug:trunk] require_relative depends on current directory 2010年1月9日23:15 Yusuke ENDOH : > 遠藤です。 > > ソースファイルを相対パスで指定して起動したとき、require_relative が > カレントディレクトリに依存するようですが、これは仕様でしょうか。 > > $ cat /tmp/t1.rb > Dir.chdir("foo") > require_relative "t2" > p foo > > $ cat /tmp/t2.rb > def foo > "/tmp/t2" > end > > $ cat /tmp/foo/t2.rb > def foo > "/tmp/foo/t2" > end > > # 相対パスで起動すると、require_relative 時のカレントディレクトリを見る > $ cd /tmp/ > $ ruby19 t1.rb > "/tmp/foo/t2" おうちのLinuxマシンでは違うエラーが出ます % ruby t1.rb :35:in `realpath': No such file or directory - /home/kosaki/linux/ruby/t/require_relative/foo/t1.rb (Errno::ENOENT) from :35:in `require_relative' from t1.rb:2:in `
' % strace ruby t1.rb (snip) chdir("foo") = 0 getcwd("/home/kosaki/linux/ruby/t/require_relative/foo", 200) = 47 lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat("/home/kosaki", {st_mode=S_IFDIR|0710, st_size=4096, ...}) = 0 lstat("/home/kosaki/linux", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0 lstat("/home/kosaki/linux/ruby", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0 lstat("/home/kosaki/linux/ruby/t", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat("/home/kosaki/linux/ruby/t/require_relative", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat("/home/kosaki/linux/ruby/t/require_relative/foo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat("/home/kosaki/linux/ruby/t/require_relative/foo/t1.rb", 0x7fff5b3f4e20) = -1 ENOENT (No such file or directory) なぜか、chdir後のrequire_relativeの中で間違ったディレクトリでt1.rbを開こうとするようです。