Ana dizine göre dosyalar nasıl açılır


95

Errno::ENOENT: No such file or directoryDosya mevcut olsa bile aşağıdakiler başarısız olur :

open('~/some_file')

Ancak bunu yapabilirim:

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

İki sorum var:

  1. openTilde neden ana dizini işaret edecek şekilde işlemiyor?
  2. Bundan daha düzgün bir yol var mı File.expand_path?

Yanıtlar:


109
  1. Kabuk (bash, zsh, vb.) Joker karakter genişletmeden sorumludur, bu nedenle ilk örneğinizde kabuk yoktur, dolayısıyla genişletme yoktur. Tilde işaretini kullanmak $HOMEyalnızca bir kuraldır; gerçekten, belgelere bakarsanız File.expand_path, tilde doğru yorumlanır, ancak bu, temel sisteme özgü bir şey değil, işlevin kendisinin bir özelliğidir; Ayrıca, File.expand_pathihtiyaç $HOMEdoğru ayarlanmış olması ortam değişkeni. Bu da bizi olası alternatife getiriyor ...
  2. Bunu dene:

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

Umarım yeterince kaygandır. Ben şahsen bir ortam değişkeni kullanmanın anlamsal olarak kullanmaktan daha açık olduğunu düşünüyorum expand_path.


pencereleri kullanmak .. yapmak zorundaydıopen(ENV['HOME']+'some_file')
David West

9
File.join(ENV['HOME'], '/some_file')Her iki durumda da çalışmasını sağlamak için kullanın .
Marcin Bilski


13

$HOMEDoğru ayarlanmış olan ortam değişkenine güvenmek yerine, geliştirme için paylaşılan ağ bilgisayarlarını kullandığınızda zorluk yaratabilir, bunu Ruby'den şu şekilde alabilirsiniz:

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

Bunun mevcut oturum açmış kullanıcıyı tanımladığını ve $HOMEayarlanan genel ortam değişkenine güvenmek yerine ana dizinini aldığını düşünüyorum . Bu, yukarıdakilere alternatif bir çözümdür.


2

Tilde sorununu keşfettim ve tilde'ı absolute_path sıradan bir karakter olarak değerlendiren bir yama oluşturuldu .

Dosya belgelerinden:

absolute_path(file_name [, dir_string] ) → abs_file_name

Bir yol adını mutlak bir yol adına dönüştürür. Dir_string verilmediği sürece, göreceli yollar, işlemin geçerli çalışma dizininden referans alınır, bu durumda başlangıç ​​noktası olarak kullanılır. Verilen yol adı "~" ile başlıyorsa GENİŞLETİLMEZ, normal dizin adı olarak değerlendirilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.