ホームディレクトリに関連するファイルを開く方法


94

Errno::ENOENT: No such file or directoryファイルが存在していても、以下はで失敗します。

open('~/some_file')

しかし、私はこれを行うことができます:

open(File.expand_path('~/some_file'))

2つの質問があります。

  1. openチルダをホームディレクトリを指すものとして処理しないのはなぜですか?
  2. より滑らかな方法はありFile.expand_pathますか?

回答:


109
  1. シェル(bash、zshなど)はワイルドカード展開を担当するため、最初の例ではシェルがないため、展開されません。チルダを使用してポイントすること$HOMEは単なる慣習です。実際、のドキュメントを見るFile.expand_pathと、チルダは正しく解釈されますが、これは関数自体の機能であり、基盤となるシステムに固有のものではありません。また、環境変数を正しく設定するFile.expand_path必要があり$HOMEます。それは私たちに可能な代替案をもたらします...
  2. これを試して:

    open(ENV['HOME']+'/some_file')

私はそれが十分に滑らかであることを望みます。個人的には、環境変数を使用する方が、を使用するよりも意味的に明確だと思いますexpand_path


Windowsの使用..やらなければならなかったopen(ENV['HOME']+'some_file')
David West 14

9
File.join(ENV['HOME'], '/some_file')どちらの場合にも機能させるために使用します。
Marcin Bilski、2015年

122

これがRuby 1.9.3より前に利用可能であったかどうかはわかりませんが、最もエレガントな解決策はDir.homeコアの一部であるものを使用することです。

open("#{Dir.home}/some_file")

2
いいえ、1.9.3未満のユーザーは使用できません(apidock.com/ruby/v1_9_2_180/Dir/home/class)。
Ian Vaughan

12

$HOME環境変数が正しく設定されていることに依存するのではなく、開発に共有ネットワークコンピューターを使用するときに面倒になる可能性がありますが、これを使用してRubyからこれを取得できます。

require 'etc'
open ("#{Etc.getpwuid.dir}/some_file")

これにより、現在ログインしているユーザーが識別され、$HOME設定されているグローバル環境変数に依存するのではなく、ホームディレクトリが取得されます。これは、私が考慮している上記の代替ソリューションです。


2

チルドの問題を発見し、チルドをabsolute_path 通常のキャラクターとして扱うように追加するパッチを作成しました。

ファイルのドキュメントから:

absolute_path(file_name [, dir_string] )  abs_file_name

パス名を絶対パス名に変換します。相対パスは、dir_stringが指定されていない限り、プロセスの現在の作業ディレクトリから参照されます。この場合、dir_stringは開始点として使用されます。指定されたパス名が「〜」で始まる場合は展開されず、通常のディレクトリ名として扱われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.