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
Dexygen
sumber
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

pengguna85509
sumber
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)

Psylone
sumber
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
59

Adapun path relatif terhadap skrip yang sedang dijalankan, karena Ruby 2.0 Anda juga dapat menggunakan

__dir__

Jadi ini pada dasarnya sama dengan

File.dirname(__FILE__)
udo
sumber
ini akan mencetak direktori kerja tempat skrip dijalankan seperti yang dikatakan @Brandon.
aldrien.h
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"

Jordan Rumpelstiltskin Nemrow
sumber
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__)
Châu Hồng Lĩnh
sumber
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"
yeshwant singh
sumber