cara mendapatkan path absolut direktori kerja saat ini dari irb


273

Saya menjalankan Ruby di Windows, tetapi saya tidak tahu apakah itu akan membuat perbedaan. Yang ingin saya lakukan adalah mendapatkan jalur absolut direktori kerja saat ini. Apakah ini mungkin dari irb? Rupanya dari skrip itu mungkin menggunakanFile.expand_path(__FILE__)

Tetapi dari irb saya mencoba yang berikut dan mendapat kesalahan "Izin ditolak":

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

10
Pertanyaannya sebenarnya tidak jelas: Apakah Anda ingin a) direktori kerja saat ini (yang Dir.pwd) atau apakah Anda ingin direktori di mana skrip yang sedang berjalan berada (yang mana File.dirname(__FILE__))? Bayangkan memanggil skrip dari tempat lain (seperti ruby testdirectory/testscript.rb) di sini, keduanya akan berbeda!
amenthes

1
@amenthes Anda mengklaim pertanyaan saya tidak jelas dan kemudian bertanya "Apakah Anda ingin a) direktori kerja saat ini ...." dan pertanyaan saya menyatakan "Yang ingin saya lakukan adalah mendapatkan jalur absolut direktori kerja saat ini ...". Apa yang tidak jelas?
Dexygen

7
tidak jelas karena kalimat "Rupanya dari skrip itu mungkin menggunakan File.expand_path(__FILE__)" - karena __FILE__lokasi adalah hewan yang berbeda dari dir bekerja saat ini (yang Dir.pwd).
amenthes

2
@amenthes Saya pikir saya melakukan pekerjaan yang cukup baik membedakan "dari irb" yang ada di sana dalam judul pertanyaan (dan dua kali dalam pertanyaan itu sendiri), dari "from a script"
Dexygen

Jawaban:


515

Dir.pwd sepertinya melakukan trik.

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


4
Sudah hampir 10 tahun, tetapi tetap, terima kasih atas jawaban ini.
Nick Schwaderer

1
Catatan: ini tidak mengembalikan lokasi file saat ini. Untuk melakukan itu, lihat jawaban di bawah ini. Ini hanya mengembalikan direktori kerja shell saat ini yang memanggil script (seperti pwd), yang mungkin berada di tempat yang sama sekali berbeda dari tempat file skrip berada.
GDP2

186

File.expand_path File.dirname(__FILE__) akan mengembalikan direktori relatif ke file dari mana perintah ini dipanggil.

Tetapi Dir.pwdmengembalikan direktori kerja (hasil identik dengan mengeksekusi pwddi terminal Anda)


3
Dir.pwdsetara dengan pwd -P. exec('pwd -L')akan mendapatkan nilai yang setara dengan pwd di terminal (pwd biasanya merupakan bash builtin, dan tidak menyelesaikan tautan simbolik).
Barry Kelly

1
silakan lihat juga kelas Pathname yang sering dilupakan: ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html
awenkhh

1
Ada masalah, Dir.pwd akan mencetak direktori kerja tempat skrip dijalankan - yang mungkin bukan yang Anda inginkan.
Brandon

Ya, dengan asumsi bahwa Anda menjalankan perintah bundle exec rspec specdi direktori '/ project', sedangkan di file 'spec / spec_helper.rb', nilai Dir.pwdmasih akan menjadi '/ project'.
sarangnya


6

Ini akan memberi Anda direktori kerja file saat ini.

File.dirname(__FILE__)

Contoh:

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

hasil: "/ Pengguna / nemrow / SITM / folder1 / folder2"


1
Harap dicatat bahwa direktori kerja tidak boleh sama dengan file yang sebenarnya. Jadi, Dir.pwddan saran Anda mungkin berbeda.
Besi

4

Jika Anda ingin mendapatkan path lengkap dari direktori file rb saat ini:

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

3

Melalui ini Anda bisa mendapatkan path absolut dari file apa pun yang terletak di direktori mana pun.

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

Ini akan kembali

=> "/User/abc/xyz/some-dir/some-file-name"
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.