LoginSignup
0
0

More than 3 years have passed since last update.

Windows で File.expand_path("~") はどうなる

Posted at

問いと短い答え

Linux や macOS では,ファイルパスの先頭の ~ は現在のユーザーのホームディレクトリーを指す。
けれど Windows はそうではない。これがしばしば,複数の OS で同じように動くべき何かを作るときに問題になる。

さて,Linux や macOS で,Ruby の

File.expand_path("~")

という式は,現在のユーザーのホームディレクトリーの絶対パスを返してくれる。

Windows でどうなるのだろう?

結論を先に書けば,Windows でも同じである。例えば以下のようになる。

p File.expand_path("~") # => "C:/Users/n-takemoto"

公式リファレンスマニュアルを見る

公式リファレンスマニュアルの File.expand_path を見ると,引数に与えた文字列の先頭の ~ENV["HOME"] を参照することになっている。

なるほど,そういうことであったか。
環境変数 HOME が適切に設定されている環境であれば,OS によらずに期待通りの動作となるわけだ。

だから,

File.expand_path("~/.ssh/id_rsa")

なんかも,期待どおり,ホームディレクトリーの下の .ssh/id_rsa の絶対パスを返してくれる。

~n-takemoto はどうなのよ

件のリファレンスマニュアルには気になる記述があった。
n-takemoto というユーザーがいたとすると,~n-takemoto はこのユーザーのホームディレクトリーの絶対パスに展開される,というのだ。へ〜

macOS と CentOS で試すと確かにそうなった。
しかし,Windows 10 では

ArgumentError (can't find user n-takemoto)

のような例外が発生した。原因は判らない。

Pathname#expand_path は?

Pathname#expand_path は内部で File.expand_path を使っているので,当然,同じような結果になる。

require "pathname"
Pathname("~").expand_path # => #<Pathname:C:/Users/n-takemoto>

のように。

(オマケ)n-takemoto って誰なのよ

野暮な質問は無し♡

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0