Làm thế nào để có được đường dẫn tuyệt đối của thư mục làm việc hiện tại từ irb


273

Tôi đang chạy Ruby trên Windows mặc dù tôi không biết liệu điều đó có làm nên sự khác biệt hay không. Tất cả những gì tôi muốn làm là có được đường dẫn tuyệt đối của thư mục làm việc hiện tại. Điều này có thể từ irb? Rõ ràng từ một kịch bản có thể sử dụngFile.expand_path(__FILE__)

Nhưng từ irb tôi đã thử các cách sau và gặp lỗi "Quyền bị từ chối":

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

10
Câu hỏi không thực sự rõ ràng: Bạn có muốn a) thư mục làm việc hiện tại (đó là Dir.pwd) hoặc bạn muốn thư mục chứa tập lệnh hiện đang chạy (đó là File.dirname(__FILE__))? Hãy tưởng tượng gọi một kịch bản từ bất cứ nơi nào khác (như ruby testdirectory/testscript.rb) ở đây, hai người sẽ khác nhau!
amenthes 22/03/2015

1
@amenthes Bạn cho rằng câu hỏi của tôi không rõ ràng và sau đó hỏi "Bạn có muốn a) thư mục làm việc hiện tại ...." và câu hỏi của tôi nói "Tất cả những gì tôi muốn làm là lấy đường dẫn tuyệt đối của thư mục làm việc hiện tại ...". Có gì không rõ ràng?
Dexygen 18/07/2015

7
không rõ vì câu "Rõ ràng từ một kịch bản có thể sử dụng File.expand_path(__FILE__)" - bởi vì __FILE__vị trí của nó là một động vật khác với thư mục làm việc hiện tại (đó là Dir.pwd).
amenthes

2
@amenthes Tôi nghĩ rằng tôi đã làm một công việc khá tốt để phân biệt "từ irb", ngay trong tiêu đề của câu hỏi (và hai lần trong chính câu hỏi), từ "từ một kịch bản"
Dexygen

Câu trả lời:


515

Dir.pwd dường như để làm các mẹo.

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


4
Đã gần 10 năm, nhưng vẫn vậy, cảm ơn bạn vì câu trả lời này.
Nick Schwaderer

1
Lưu ý: điều này không trả về vị trí của tệp hiện tại. Để làm điều đó, xem các câu trả lời dưới đây. Điều này chỉ trả về thư mục làm việc hiện tại của shell đang gọi tập lệnh (giống như pwd), có thể ở một nơi hoàn toàn khác với nơi tập tin tập lệnh được đặt.
GDP2

186

File.expand_path File.dirname(__FILE__) sẽ trả về thư mục liên quan đến tập tin mà lệnh này được gọi từ.

Nhưng Dir.pwdtrả về thư mục làm việc (kết quả giống với thực thi pwdtrong thiết bị đầu cuối của bạn)


3
Dir.pwdtương đương với pwd -P. exec('pwd -L')sẽ nhận được tương đương với pwd trong thiết bị đầu cuối (pwd thường là một bash dựng sẵn và không giải quyết các liên kết tượng trưng).
Barry Kelly

1
vui lòng xem qua lớp Pathname thường bị lãng quên: ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html
awenkhh

1
Có một vấn đề, Dir.pwd sẽ in thư mục làm việc nơi tập lệnh được chạy - có thể không phải là điều bạn muốn.
Brandon

Có, giả sử rằng bạn chạy lệnh bundle exec rspec spectrong thư mục '/ project', trong khi trong tệp 'spec / spec_helper.rb', giá trị của Dir.pwdvẫn sẽ là '/ dự án'.
hiveer


6

Điều này sẽ cung cấp cho bạn thư mục làm việc của tập tin hiện tại.

File.dirname(__FILE__)

Thí dụ:

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

kết quả: "/ Users / nemrow / SITM / thư mục1 / thư mục2"


1
Xin lưu ý rằng thư mục làm việc không được giống với tệp thực tế. Vì vậy, Dir.pwdvà đề nghị của bạn có thể có khả năng khác nhau.
Besi

4

Nếu bạn muốn lấy đường dẫn đầy đủ của thư mục của tệp rb hiện tại:

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

3

Thông qua đó bạn có thể nhận được đường dẫn tuyệt đối của bất kỳ tệp nào nằm trong bất kỳ thư mục nào.

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

Điều này sẽ trở lại

=> "/User/abc/xyz/some-dir/some-file-name"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.