問いと短い答え
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 って誰なのよ
野暮な質問は無し♡