作業ディレクトリをスクリプトのあるディレクトリに変更するイディオム(Win環境の日本語パス関連で追記有り)

Dir.chdir(File.expand_path(File.dirname(__FILE__)))
Dir.chdir(File.dirname(File.expand_path(__FILE__)))

他のスクリプトからrequire/loadで読み出されるスクリプトで、そのスクリプトファイルからの相対ディレクトリのファイルを(永続化などで)指定していたりするときに利用します。

追記:Pathnameライブラリを使った場合('14/4/14追記)

class Pathname

クラスの継承リスト: Pathname < Object < Kernel < BasicObject

要約

パス名をオブジェクト指向らしく扱うクラスです。
Pathname オブジェクトはパス名を表しており、ファイルやディレクトリそのものを表してはいません。 当然、存在しないファイルのパス名も扱えます。
絶対パス相対パスも扱えます。
Pathname オブジェクトは immutable であり、自身を破壊的に操作するメソッドはありません。
class Pathname (Ruby 1.9.3)

オブジェクト指向Rubyを使うなら、やはりファイルやディレクトリなどもオブジェクト指向でやりたいですよね。
ということで、スクリプトファイルのあるディレクトリをPathnameで取得してみます。

Pathname(__FILE__).expand_path.dirname

メソッドチェーンで得られるのがオブジェクト指向っぽいですねw
このディレクトリへ移動する場合には、このインスタンスをそのままDir.chdirの引数に与えれば良いです。Pathname#to_sは不要です。

Dir.chdir(Pathname(__FILE__).expand_path.dirname)

これも使ってみましょう。

2013/8/6追記:

Windows XPruby 1.9.3p448(i386-mingw32)の場合、File.expand_path(File.dirname(__FILE__))だとexpand_pathの際に日本語名フォルダが文字化けします。
先にexpand_pathしたFile.dirname(File.expand_path(__FILE__))ならば問題なし。
だいたいのイディオムではFile.expand_path(File.dirname(__FILE__))と書いてあるだけど、確認したところ

File.dirname(File.expand_path(__FILE__))

のほうが良いことが分かった。

適切な書き順のものが使われてない

ググってみると
google:"File.expand_path(File.dirname(__FILE__))" → 約 571,000 件
google:"File.dirname(File.expand_path(__FILE__))" → 約 45,700 件
となっている(2013/8/6現在)。

でも

まずexpandして引き続きファイル名削除、という順番のほうがオススメです。
先にファイル名削除すると単に「.」になってしまい、にっちもさっちもいかなくなることもあります。
ぜひ File.dirname(File.expand_path(__FILE__))(もしくは Pathname(__FILE__).expand_path.dirname )を使いましょう。