Bagaimana membuka file relatif terhadap direktori home

95

Berikut ini gagal dengan Errno::ENOENT: No such file or directory, bahkan jika file tersebut ada:

open('~/some_file')

Namun, saya bisa melakukan ini:

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

Saya punya dua pertanyaan:

  1. Mengapa tidak openmemproses tilde sebagai menunjuk ke direktori home?
  2. Apakah ada cara yang lebih licin dari File.expand_path?
Peter
sumber

Jawaban:

109
  1. Shell (bash, zsh, dll) bertanggung jawab atas ekspansi wildcard, jadi dalam contoh pertama Anda tidak ada shell, karenanya tidak ada ekspansi. Menggunakan tilde sebagai tujuan $HOMEadalah konvensi belaka; memang, jika Anda melihat dokumentasinya File.expand_path, itu dengan benar menafsirkan tilde, tapi itu fitur dari fungsi itu sendiri, bukan sesuatu yang melekat pada sistem yang mendasarinya; juga, File.expand_pathmembutuhkan $HOMEvariabel lingkungan untuk disetel dengan benar. Yang membawa kita ke alternatif yang mungkin ...
  2. Coba ini:

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

Saya harap ini cukup apik. Saya pribadi berpikir menggunakan variabel lingkungan secara semantik lebih jelas daripada menggunakan expand_path.

Roadmaster
sumber
menggunakan windows .. harus dilakukanopen(ENV['HOME']+'some_file')
David West
9
Gunakan hanya File.join(ENV['HOME'], '/some_file')untuk membuatnya berfungsi dalam kedua kasus.
Marcin Bilski
123

Tidak yakin apakah ini tersedia sebelum Ruby 1.9.3 tetapi saya menemukan bahwa solusi paling elegan adalah menggunakan Dir.homeyang merupakan bagian dari inti.

open("#{Dir.home}/some_file")
allesklar.dll
sumber
2
Tidak, tidak tersedia untuk pengguna di bawah 1.9.3 ( apidock.com/ruby/v1_9_2_180/Dir/home/class ).
Ian Vaughan
12

Daripada mengandalkan $HOMEvariabel lingkungan yang disetel dengan benar, yang bisa merepotkan saat Anda menggunakan komputer jaringan bersama untuk pengembangan, Anda bisa mendapatkannya dari Ruby menggunakan:

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

Saya percaya ini mengidentifikasi pengguna yang masuk saat ini dan mendapatkan direktori home mereka daripada mengandalkan $HOMEvariabel lingkungan global yang disetel. Ini adalah solusi alternatif menurut saya di atas.

Voke Ransom Anighoro
sumber
2

Saya menemukan masalah tilde, dan tambalan dibuat untuk menambahkan absolute_path yang memperlakukan tilde sebagai karakter biasa.

Dari dokumentasi File:

absolute_path(file_name [, dir_string] )  abs_file_name

Mengonversi nama jalur menjadi nama jalur absolut. Path relatif dirujuk dari direktori kerja saat ini dari proses tersebut kecuali dir_string diberikan, dalam hal ini akan digunakan sebagai titik awal. Jika nama jalur yang diberikan dimulai dengan "~", ini TIDAK diperluas, ini diperlakukan sebagai nama direktori normal.

Charles Edward Thornton
sumber