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?

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.


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


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.