วิธีรับพา ธ สัมบูรณ์ของไดเร็กทอรีการทำงานปัจจุบันจาก irb


273

ฉันใช้ Ruby บน Windows แม้ว่าฉันจะไม่รู้ว่าควรสร้างความแตกต่างหรือไม่ สิ่งที่ฉันต้องการทำคือรับเส้นทางสัมบูรณ์ของไดเรกทอรีการทำงานปัจจุบัน เป็นไปได้จาก irb? เห็นได้ชัดจากสคริปต์ที่เป็นไปได้โดยใช้File.expand_path(__FILE__)

แต่จาก irb ฉันลองต่อไปนี้และได้รับข้อผิดพลาด "การอนุญาตถูกปฏิเสธ":

File.new(Dir.new(".").path).expand

10
คำถามไม่ชัดเจนจริง ๆ : คุณต้องการ a) ไดเรกทอรีการทำงานปัจจุบัน (ซึ่งคือDir.pwd) หรือคุณต้องการไดเรกทอรีที่สคริปต์ที่กำลังทำงานอยู่ (ซึ่งคือFile.dirname(__FILE__)) หรือไม่ ลองนึกภาพการเรียกสคริปต์จากที่อื่น (เช่นruby testdirectory/testscript.rb) ที่นี่ทั้งสองจะแตกต่างกัน!
amenthes

1
@ หลักการคุณอ้างว่าคำถามของฉันไม่ชัดเจนจากนั้นให้ถาม "คุณต้องการหรือไม่) ไดเรกทอรีการทำงานปัจจุบัน .... " และคำถามของฉันระบุ "สิ่งที่ฉันต้องการจะทำคือได้รับเส้นทางสัมบูรณ์ของไดเรกทอรีการทำงานปัจจุบัน ... " ไม่มีความชัดเจนอะไร
Dexygen

7
ไม่มีความชัดเจนเนื่องจากประโยค "เห็นได้ชัดจากสคริปต์ที่เป็นไปได้โดยใช้File.expand_path(__FILE__)" - เนื่องจาก__FILE__ตำแหน่งของสัตว์แตกต่างจาก dir ที่ทำงานอยู่ในปัจจุบัน (ซึ่งก็คือDir.pwd)
amenthes

2
@ หลักการฉันคิดว่าฉันทำได้ดีมากในการแยกความแตกต่าง "จาก irb" ซึ่งอยู่ตรงนั้นในชื่อของคำถาม (และเพิ่มขึ้นสองเท่าภายในคำถาม) จาก "จากสคริปต์"
Dexygen

คำตอบ:


515

Dir.pwd ดูเหมือนว่าจะทำเคล็ดลับ

http://ruby-doc.org/core/Dir.html#method-c-pwd


4
เกือบ 10 ปีแล้ว แต่ก็ยังขอบคุณสำหรับคำตอบนี้
Nick Schwaderer

1
หมายเหตุ: สิ่งนี้จะไม่ส่งคืนตำแหน่งของไฟล์ปัจจุบัน ในการดำเนินการดังกล่าวโปรดดูคำตอบด้านล่าง สิ่งนี้จะส่งคืนไดเร็กทอรีการทำงานปัจจุบันของเชลล์ที่กำลังเรียกใช้สคริปต์ (เช่นเดียวกับpwd) ซึ่งอาจแตกต่างอย่างสิ้นเชิงจากที่เก็บไฟล์สคริปต์
GDP2

186

File.expand_path File.dirname(__FILE__) จะส่งคืนไดเร็กทอรีที่สัมพันธ์กับไฟล์ที่คำสั่งนี้ถูกเรียกใช้

แต่Dir.pwdส่งคืนไดเรกทอรีทำงาน (ผลลัพธ์เหมือนกับการดำเนินการpwdในเทอร์มินัลของคุณ)


3
Dir.pwdpwd -Pเทียบเท่ากับ exec('pwd -L')จะได้รับเทียบเท่า pwd ใน terminal (pwd ปกติแล้วจะเป็น bash builtin และไม่แก้ไขลิงก์สัญลักษณ์)
Barry Kelly

1
โปรดดูคลาส Pathname ที่ลืมบ่อยๆด้วย: ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html
awenkhh

1
มีปัญหา Dir.pwd จะพิมพ์ไดเรกทอรีทำงานของที่สคริปต์รัน - ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
Brandon

ใช่สมมติว่าคุณรันคำสั่งbundle exec rspec specในไดเรกทอรี '/ project' ในขณะที่อยู่ในไฟล์ 'spec / spec_helper.rb' ค่าของ Dir.pwdจะยังคงเป็น '/ project'
รัก

59

สำหรับพา ธ ที่สัมพันธ์กับสคริปต์การดำเนินการปัจจุบันตั้งแต่Ruby 2.0คุณสามารถใช้

__dir__

ดังนั้นนี่ก็เหมือนกับ

File.dirname(__FILE__)

14
@Zequez เพราะ__FILE__เป็นค่าคงที่ แต่__dir__เป็นวิธีการที่
Phrogz

สิ่งนี้จะพิมพ์ไดเรกทอรีการทำงานของที่สคริปต์จะถูกเรียกใช้เป็น @Brandon กล่าว
aldrien.h

6

นี่จะให้ไดเรกทอรีการทำงานของไฟล์ปัจจุบันแก่คุณ

File.dirname(__FILE__)

ตัวอย่าง:

current_file: "/Users/nemrow/SITM/folder1/folder2/amazon.rb"

ผลลัพธ์: "/ Users / nemrow / SITM / folder1 / folder2"


1
โปรดทราบว่าไดเรกทอรีการทำงานจะต้องไม่เหมือนกับไฟล์จริง ดังนั้นDir.pwdและข้อเสนอแนะของคุณอาจแตกต่างกัน
Besi

4

หากคุณต้องการรับพา ธ แบบเต็มของไดเร็กทอรีของไฟล์ rb ปัจจุบัน:

File.expand_path('../', __FILE__)

3

ผ่านทางนี้คุณจะได้รับเส้นทางที่แน่นอนของไฟล์ใด ๆ ที่อยู่ในไดเรกทอรีใด ๆ

File.join(Dir.pwd,'some-dir','some-file-name')

สิ่งนี้จะกลับมา

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