2011-12-16 70 views
14

我有一個Ruby腳本,路徑爲/foo/bar/gazook/script.rb。我還在$HOME/bin中創建了一個符號鏈接。在創建一個文件符號鏈接之後,如何獲取Ruby中原始文件的路徑?

現在,我想讓我的Ruby腳本訪問目錄/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是當前腳本的名稱。

-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`的第二個參數應該是*目錄*,而不是文件名。 – 2011-12-16 20:33:27

+0

好吧,我在〜/ bin目錄下創建了一個測試文件,一個符號鏈接,並且在運行符號鏈接時,我得到了「/ home」。所以我很抱歉,我的解決方案不起作用:( – maprihoda 2011-12-16 21:31:07

2

試試這個

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

要得到任何路徑相對於你的腳本的位置,總是使用__dir__

__dir__是一種簡潔的說法File.dirname(File.realpath(__FILE__))。它在Ruby> = 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__))

相關問題