Як відкрити файли щодо домашнього каталогу


95

Не вдається виконати такі дії Errno::ENOENT: No such file or directory, навіть якщо файл існує:

open('~/some_file')

Однак я можу зробити це:

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

У мене є два запитання:

  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.


за допомогою вікон .. треба було зробитиopen(ENV['HOME']+'some_file')
Девід Вест

9
Використовуйте просто, File.join(ENV['HOME'], '/some_file')щоб це працювало в обох випадках.
Marcin Bilski,


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, і в цьому випадку він буде використаний як початкова точка. Якщо вказане ім'я шляху починається з «~», воно НЕ розширюється, воно трактується як звичайне ім'я каталогу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.