Help us understand the problem. What is going on with this article?

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

問いと短い答え

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 って誰なのよ

野暮な質問は無し♡

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした