Как открыть файлы относительно домашнего каталога - PullRequest
84 голосов
/ 24 марта 2010

Следующее сбой при Errno::ENOENT: No such file or directory, даже если файл существует:

open('~/some_file')

Однако я могу сделать это:

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

У меня есть два вопроса:

  1. Почему open не обрабатывает тильду как указатель на домашний каталог?
  2. Есть ли более гладкий путь, чем File.expand_path?

Ответы [ 4 ]

114 голосов
/ 14 августа 2012

Не уверен, что это было доступно до Ruby 1.9.3, но я считаю, что наиболее элегантным решением является использование Dir.home, который является частью ядра.

open("#{Dir.home}/some_file")
102 голосов
/ 24 марта 2010
  1. Оболочка (bash, zsh и т. Д.) Отвечает за расширение по шаблону, поэтому в вашем первом примере нет оболочки, следовательно, нет расширения. Использование тильды для указания на $HOME является простым соглашением; действительно, если вы посмотрите на документацию для File.expand_path, она правильно интерпретирует тильду, но это особенность самой функции, а не что-то присущее базовой системе; кроме того, File.expand_path требует, чтобы переменная окружения $HOME была правильно установлена. Что приводит нас к возможной альтернативе ...
  2. Попробуйте это:

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

Я надеюсь, что это достаточно гладко. Я лично думаю, что использование переменной окружения семантически понятнее, чем использование expand_path.

12 голосов
/ 02 февраля 2012

Вместо того, чтобы полагаться на правильную настройку переменной среды $HOME, что может быть хлопотно, если вы используете совместно используемые сетевые компьютеры для разработки, вы можете получить это из Ruby, используя:

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

Я полагаю, что это идентифицирует текущего вошедшего в систему пользователя и получает его домашний каталог, а не полагается на устанавливаемую глобальную переменную среды $HOME. Я считаю, что это альтернативное решение выше.

2 голосов
/ 15 апреля 2014

Я обнаружил проблему с тильдой, и был создан патч для добавления absolute_path который рассматривает тильду как обычный характер.

Из файловой документации:

absolute_path(file_name [, dir_string] ) → abs_file_name

Преобразует имя пути в абсолютное имя пути. Относительные пути ссылаются из текущего рабочего каталога процесса, если только не указана dir_string, и в этом случае она будет использоваться в качестве начальной точки Если заданный путь начинается с «~», он НЕ раскрывается, он обрабатывается как обычное имя каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...