2011-12-20 35 views
27

Tôi đang cố gắng tham chiếu đến tập lệnh được chuyển tới trình thông dịch ruby. Ví dụ: nếu tôi đang chạy ruby foo.rb Tôi muốn tham chiếu đến tệp foo.rb.Ruby - nhận tệp đang được thực hiện

Tôi nghĩ bằng Python, điều này có thể truy cập được thông qua sys.argv[0]. Người ta có thể gọi __FILE__ tuy nhiên đây không phải là giải pháp mà tôi đang tìm kiếm, vì __FILE__ mang lại tệp bên trong mà mã thực thi hiện tại nằm ở.

Có cách nào để làm điều đó không?

Trả lời

40

Tôi tìm thấy $0 là tên của tệp được sử dụng để bắt đầu chương trình. Vừa đủ dễ.

+8

alse $ program_name –

31

Sử dụng phương pháp trong lớp File để thao tác FILE

Bên test.rb, tôi có

puts __FILE__ 
puts File.dirname(__FILE__) 
puts File.basename(__FILE__) 

Khi bạn chạy,

ruby a/b/test.rb 

Bạn nhận được

a/b/test.rb 
a/b 
test.rb 
+0

sẽ không làm việc http://softwareapprenticeship.wordpress.com/2009/05/20/0-in-ruby-is-worth-more-than-youd-think/ – Bohdan

+0

Như đã nói _ _ FILE _ _ lấy tập tin hiện tại của tập lệnh thực thi. Đó là nó cho mã trong test.rb nó sẽ luôn luôn trả về test.rb, cho mã trong something_else.rb nó sẽ luôn trả về something_else.rb. Câu hỏi của tôi là trả lại kịch bản ban đầu được chạy bởi trình thông dịch ruby. –

+0

Đây là câu trả lời tôi đang tìm kiếm. Khi chạy các tập tin từ 'irb', tôi không muốn '$ 0' cho tôi biết rằng tên chương trình là' irb', nhưng tôi muốn biết tập tin kịch bản nào đang được thực hiện. –

0

Hãy để tôi thêm một liên kết chính thức tới $0 cho độc giả. Đây là một trong những biến toàn cục do Ruby cung cấp.

http://ruby-doc.org/core-2.0.0/doc/globals_rdoc.html

Chứa tên của kịch bản được thực thi. Có thể được chuyển nhượng.

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