2011-12-16 23 views
14

मेरे पास पथ /foo/bar/gazook/script.rb पथ के साथ रूबी स्क्रिप्ट है। मैंने $HOME/bin में इसके लिए एक सिम्लिंक भी बनाया।फ़ाइल को सिम्लिंक करने के बाद, मुझे रूबी में मूल फ़ाइल का मार्ग कैसे प्राप्त होगा?

अब, मैं अपनी रूबी स्क्रिप्ट निर्देशिका /foo में किसी अन्य फ़ाइल तक पहुंचने के लिए चाहता हूं, और पथ को सापेक्ष रखने के लिए, मेरे पास मेरी स्क्रिप्ट में एक चर FOO_DIRECTORY = File.expand_path(File.dirname(__FILE__) + "/../../") है।

समस्या (के बाद से मैं अपने किसी अन्य स्थान से विस्तार हो रहा है लगता है) है कि अगर मैं अपने सिमलिंक से मेरी स्क्रिप्ट चलाने, इस रिश्तेदार निर्देशिका गलत है।

मैं इसे कैसे ठीक करूं? क्या एक पूर्ण पथ का उपयोग करने के अलावा कोई रास्ता है?

उत्तर

10

व्याख्या करने के तरीके आप एक सिमलिंक हल करने File.readlink उपयोग कर सकते हैं, लेकिन आप File.symlink? पहले जाँच करना चाहते हैं जाएगा।

path = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ 

तो फिर तुम path बजाय __FILE__ के साथ काम कर सकते हैं। साथ ही आप $0 बजाय __FILE__ का उपयोग करना चाहें, __FILE__ वर्तमान फ़ाइल नाम जबकि $0 वर्तमान स्क्रिप्ट का नाम है।

+3

अधिक सामान्य समाधान के लिए, आपको एक लूप में सिम्लिंक को हल करने की आवश्यकता है, क्योंकि एक सिम्लिंक दूसरे को इंगित कर सकता है। इसके अलावा, आपको पथ के प्रत्येक भाग को जांचना होगा: 'bin' एक हो सकता है symlink भी। मैं 'File.realpath' की सिफारिश करेंगे। – hagello

-1

इस प्रयास करें:

FOO_DIRECTORY = File.expand_path("../../../", __FILE__) 

मैं मान लें कि समस्या यह है कि आपके सिमलिंक फ़ाइल File.dirname(__FILE__)

+0

'expand_path' सिमलिंक का समाधान नहीं होता है और निर्दिष्ट' dir_string' मदद नहीं करेगा उपयोग करने के लिए अच्छा होगा: [ "सापेक्ष रास्तों में से वर्तमान कार्यशील निर्देशिका द्वारा दर्शाया जाता है प्रक्रिया जब तक dir_string नहीं दी जाती है, इस मामले में इसे शुरुआती बिंदु के रूप में उपयोग किया जाएगा। "] (http://ruby-doc.org/core-1.9.3/File.html#method-c-expand_path)। इसके अलावा, 'expand_path' के लिए दूसरा तर्क एक * निर्देशिका * होना चाहिए, फ़ाइल नाम नहीं। –

+0

ठीक है, मैंने एक परीक्षण फ़ाइल बनाई है, मेरी ~/bin निर्देशिका में एक सिम्लिंक, और सिम्लिंक चलाते समय, मुझे "/ home" मिलता है।इसलिए मैं क्षमा चाहता हूं, मेरा समाधान काम नहीं करता है :( – maprihoda

+0

और यह भी ध्यान दें कि 'File.expand_path ("..", __FILE __)' फ़ाइल.dirname (__ फ़ाइल __) ' –

2

इस

require 'pathname' 
p File.dirname(Pathname.new(__FILE__).realpath) 
5

प्रयास करें अपनी स्क्रिप्ट के स्थान के लिए किसी भी पथ रिश्तेदार पाने के लिए, हमेशा उपयोग __dir__

__dir__File.dirname(File.realpath(__FILE__)) कह का एक संक्षिप्त तरीका है। यह रूबी> = 2.0 में उपलब्ध है। On __dir__

File.realpath(__FILE__) (या Pathname#realpath) File.readlink की तुलना में तीन फायदे हैं:

  • यह सिमलिंक कहीं भी रास्ते में फैलता है। readlink केवल उन पथों को फैलाता है जो तर्क के अंतिम भाग हैं।
  • यह (रिकर्सिवली) सिमलिंक के लिए सिमलिंक निराकरण करने के लिए ... readlink केवल प्रथम स्तर हल करता है।
  • आपको यह जांचना नहीं है कि path एक सिम्लिंक है। इस प्रकार आप if File.symlink? छोड़ सकते हैं।

नतीजतन यह FOO_DIRECTORY = File.join(__dir__, '..', '..') या FOO_DIRECTORY = File.dirname(File.dirname(__dir__))