2010-02-09 21 views
5

Tôi có một tập lệnh Ruby định nghĩa một lớp. Tôi muốn kịch bản để thực hiện báo cáo kết quảLàm thế nào một tập lệnh Ruby có thể phát hiện rằng nó đang chạy trong IRB?

BoolParser.generate :file_base=>'bool_parser' 

chỉ khi kịch bản được gọi là thực thi, không phải khi nó là require 'd từ IRB (hoặc thông qua trên dòng lệnh qua -r). Tôi có thể bọc xung quanh câu lệnh trên để ngăn không cho nó thực hiện bất cứ khi nào tệp Ruby của tôi được tải?

Trả lời

13

Điều kiện $0 == __FILE__ ...

!/usr/bin/ruby1.8 

class BoolParser 

    def self.generate(args) 
    p ['BoolParser.generate', args] 
    end 

end 

if $0 == __FILE__ 
    BoolParser.generate(:file_base=>__FILE__) 
end 

... là đúng khi tập lệnh được chạy từ dòng lệnh ...

$ /tmp/foo.rb 
["BoolParser.generate", {:file_base=>"/tmp/foo.rb"}] 

... nhưng sai khi tệp được yêu cầu hoặc được tải bởi tập lệnh ruby ​​khác.

$ irb1.8 
irb(main):001:0> require '/tmp/foo' 
=> true 
irb(main):002:0> 
3

sử dụng $ 0

trong IRB giá trị của $ 0 là "IRB"

trong tập tin của bạn là "/ path/to/file"

một lời giải thích here

Các vấn đề liên quan