6

Ruby 1.9.3 を使用して、システム管理用のいくつかの小さな Ruby スクリプトを作成しました。私が使用する1つのスクリプトでは:

File.dirname(__FILE__)

スクリプトファイルのディレクトリを取得します。これは相対パスを返しますが、2 番目のスクリプトからスクリプトを呼び出すとFile.dirname、絶対パスが返されます。

Ruby Docの例では絶対リターン パスがリストされていますが、Ruby フォーラムでユーザーがdirname相対パスのみを返す必要があるという議論を見つけました。

Ruby Forums から提案されたソリューションを使用File.expand_pathして、常に次のような絶対パスを取得しています。

File.expand_path(File.dirname(__FILE__))

dirnameしかし、動作を一貫させる方法はありますか?


アップデート:

Janathan Cairs の回答を拡張するために、2 つのスクリプトを作成しました。

s1.rb:

puts "External script __FILE__: #{File.dirname(__FILE__)}"

s0.rb:

puts "Local script __FILE__: #{File.dirname(__FILE__)}"
require './s1.rb'

./s0.rb を実行すると、次の出力が得られます。

Local script __FILE__: .
External script __FILE__: /home/kenneth/Pictures/wp/rip_vault
4

2 に答える 2

9

File.dirname絶対パスが指定されている場合は絶対パスを返し、相対パスが指定されている場合は相対パスを返す必要があります。

File.dirname('/home/jon/test.rb') # => '/home/jon'
File.dirname('test.rb') # => '.'

__FILE__現在のスクリプトの名前を返します。これは、現在のディレクトリからの相対パスです。つまりexpand_path、で絶対パスを取得する場合は、常にを使用する必要がありますFile.dirname(__FILE__)

NBRuby2.0.0は定数を導入します__dir__

于 2013-03-12T10:31:48.700 に答える
4

すでにRuby2.0にアップグレードしている場合、新しい定数を使用できます

__dir__

それ以外の場合は使用できます

File.expand_path('..', __FILE__)

より短い

File.expand_path(File.dirname(__FILE__))

File.expand_pathドキュメント

于 2013-03-12T10:33:35.887 に答える