From: Nobuyoshi Nakada Date: 2007-04-04T00:34:47+09:00 Subject: [ruby-dev:30680] Re: IO.popen doesn't fail for non-existent command なかだです。 At Tue, 3 Apr 2007 19:26:15 +0900, nobu@ruby-lang.org wrote in [ruby-dev:30679]: > http://bts.vinelinux.org/guest.cgi?project=VineLinux&action=view_report&id=481 > 「481: ri で command not found: pager」に関連した話ですが、 > IO.popenに存在しないコマンドを指定したときにエラーにならないの > は、少なくとも1.9でバグだと思います。 1.8用に、ri_display.rbのパッチです。やってることは1.9と同じです。 Index: lib/rdoc/ri/ri_display.rb =================================================================== --- lib/rdoc/ri/ri_display.rb (revision 12136) +++ lib/rdoc/ri/ri_display.rb (working copy) @@ -211,5 +211,30 @@ class DefaultDisplay def setup_pager unless @options.use_stdout - for pager in [ ENV['PAGER'], "less", "more", 'pager' ].compact.uniq + pagers = [ ENV['PAGER'], "less", "more", 'pager' ].compact.uniq + begin + require 'fcntl' + if defined?(Fcntl::F_SETFD) and defined?(Fcntl::FD_CLOEXEC) + r, w = IO.pipe + w.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) + unless f = IO.popen("-", "w") + r.close + for pager in pagers + exec(pager) rescue nil + end + w.write("\0") + w.close + exit! + end + w.close + w = nil + return f unless r.getc + f.close + pagers.clear + end + rescue LoadError, Errno::ENOENT, NotImplementedError + ensure + [r, w].each {|f| (f.close if f and !f.closed?) rescue nil} + end + for pager in pagers return IO.popen(pager, "w") rescue nil end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦