วิธีเปิดไฟล์ที่สัมพันธ์กับโฮมไดเร็กทอรี


95

สิ่งต่อไปนี้ล้มเหลวErrno::ENOENT: No such file or directoryแม้ว่าไฟล์จะมีอยู่:

open('~/some_file')

อย่างไรก็ตามฉันสามารถทำได้:

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

ฉันมีคำถามสองข้อ:

  1. เหตุใดจึงไม่openประมวลผลเครื่องหมายทิลเดอร์ให้ชี้ไปที่โฮมไดเร็กทอรี
  2. มีวิธีที่ลื่นกว่าFile.expand_pathไหม?

คำตอบ:


110
  1. เชลล์ (bash, zsh ฯลฯ ) มีหน้าที่ในการขยายสัญลักษณ์แทนดังนั้นในตัวอย่างแรกของคุณจึงไม่มีเชลล์จึงไม่มีการขยาย การใช้เครื่องหมายทิลเดอเพื่อชี้ไปยัง$HOMEเป็นเพียงแบบแผนเท่านั้น ถ้าคุณดูเอกสารประกอบFile.expand_pathมันแปลเครื่องหมายทิลเดอร์ได้อย่างถูกต้อง แต่มันเป็นคุณสมบัติของฟังก์ชันเองไม่ใช่สิ่งที่มีอยู่ในระบบพื้นฐาน นอกจากนี้ยังFile.expand_pathต้องกำหนด$HOMEตัวแปรสภาพแวดล้อมให้ถูกต้อง ซึ่งนำเราไปสู่ทางเลือกที่เป็นไปได้ ...
  2. ลองสิ่งนี้:

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

ฉันหวังว่ามันจะเนียนพอ expand_pathผมเองคิดว่าการใช้ตัวแปรสภาพแวดล้อมเป็นความหมายที่ชัดเจนกว่าการใช้


ใช้ windows .. ต้องทำopen(ENV['HOME']+'some_file')
David West

10
ใช้เพียงFile.join(ENV['HOME'], '/some_file')เพื่อให้ทำงานได้ในทั้งสองกรณี
Marcin Bilski

124

ไม่แน่ใจว่าสิ่งนี้มีให้ก่อน Ruby 1.9.3 หรือไม่ แต่ฉันพบว่าทางออกที่ดีที่สุดคือการใช้Dir.homeซึ่งเป็นส่วนหนึ่งของคอร์

open("#{Dir.home}/some_file")

2
ไม่ใช้ไม่ได้สำหรับผู้ใช้ที่ต่ำกว่า 1.9.3 ( apidock.com/ruby/v1_9_2_180/Dir/home/class )
Ian Vaughan

13

แทนที่จะใช้$HOMEตัวแปรสภาพแวดล้อมที่ตั้งค่าไว้อย่างถูกต้องซึ่งอาจเป็นเรื่องยุ่งยากเมื่อคุณใช้คอมพิวเตอร์เครือข่ายที่ใช้ร่วมกันในการพัฒนาคุณสามารถรับสิ่งนี้ได้จาก Ruby โดยใช้:

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

ฉันเชื่อว่าสิ่งนี้ระบุผู้ใช้ที่ล็อกอินปัจจุบันและรับโฮมไดเร็กทอรีแทนที่จะอาศัย$HOMEตัวแปรสภาวะแวดล้อมส่วนกลางที่ตั้งค่าไว้ นี่เป็นทางเลือกอื่นในการแก้ปัญหาข้างต้นที่ฉันคิดไว้


2

ฉันค้นพบปัญหาตัวหนอนและมีการสร้างแพตช์เพื่อเพิ่มabsolute_path ซึ่งถือว่าทิลเดอเป็นอักขระธรรมดา

จากเอกสาร File:

absolute_path(file_name [, dir_string] ) → abs_file_name

แปลงชื่อพา ธ เป็นชื่อพา ธ สัมบูรณ์ พา ธ สัมพัทธ์อ้างอิงจากไดเร็กทอรีการทำงานปัจจุบันของกระบวนการเว้นแต่จะกำหนด dir_string ซึ่งในกรณีนี้จะถูกใช้เป็นจุดเริ่มต้น หากชื่อพา ธ ที่กำหนดขึ้นต้นด้วย“ ~” จะไม่ถูกขยายจะถือว่าเป็นชื่อไดเร็กทอรีปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.