як отримати абсолютний шлях поточного робочого каталогу від irb


273

Я запускаю Ruby у Windows, хоча не знаю, чи має це змінити ситуацію. Все, що я хочу зробити, це отримати абсолютний шлях поточного робочого каталогу. Це можливо з irb? Мабуть, із сценарію це можливо використовуватиFile.expand_path(__FILE__)

Але з irb я спробував таке, і отримав помилку "Дозвіл відмовлено":

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

10
Питання насправді не ясно: чи хочете ви: а) поточну робочу директорію (яка є Dir.pwd) чи ви хочете каталог, де знаходиться поточний запущений сценарій (який є File.dirname(__FILE__))? Уявіть, що викличте сценарій з будь-якого іншого місця (як ruby testdirectory/testscript.rb) тут, два будуть різними!
аменте

1
@amenthes Ви стверджуєте, що моє питання незрозуміле, і ви запитуєте "Чи хочете ви а) поточну робочу директорію ....", а в моєму запитанні "Все, що я хочу зробити, це отримати абсолютний шлях поточного робочого каталогу ...". Що незрозуміло?
Dexygen

7
це незрозуміло через речення "Мабуть, за сценарієм це можливо використовувати File.expand_path(__FILE__)" - тому __FILE__що місце розташування - це інша тварина, ніж поточний робочий реж (який є Dir.pwd).
амент

2
@amenthes Я думав, що я зробив досить непогану роботу, відрізняючи "від irb", що знаходиться прямо в назві питання (і двічі в самому питанні), від "від сценарію"
Dexygen

Відповіді:


515

Dir.pwd здається, зробить трюк.

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


4
Майже минуло 10 років, але все ж, дякую за цю відповідь.
Нік

1
Примітка. Це не повертає місцезнаходження поточного файлу. Для цього дивіться відповіді нижче. Це лише повертає поточний робочий каталог оболонки, яка викликає скрипт (точно так само pwd), яка може бути десь зовсім іншою, ніж там, де знаходиться файл сценарію.
ВВП2

186

File.expand_path File.dirname(__FILE__) поверне каталог відносно файлу, з якого викликається ця команда.

Але Dir.pwdповертає робочий каталог (результати ідентичні виконанню pwdу вашому терміналі)


3
Dir.pwdеквівалентно pwd -P. exec('pwd -L')отримає еквівалент pwd в терміналі (pwd, як правило, вбудований bash, і не вирішує символічні посилання).
Баррі Келлі

1
зверніть увагу також на часто забутий клас Pathname
awenkhh

1
Виникла проблема, Dir.pwd надрукує робочий каталог, де виконується сценарій - що може бути не тим, що потрібно.
Брендон

Так, якщо припустити, що ви запускаєте команду bundle exec rspec specв каталозі '/ project', тоді як у файлі 'spec / spec_helper.rb', значення як Dir.pwdі раніше буде '/ project'.
вулик

59

Що стосується шляху відносно поточного сценарію виконання, то з Ruby 2.0 ви також можете використовувати

__dir__

Так це в основному те саме, що

File.dirname(__FILE__)


це надрукує робочий каталог, де виконується сценарій, як сказав @Brandon.
aldrien.h

6

Це дасть вам робочий каталог поточного файлу.

File.dirname(__FILE__)

Приклад:

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

результат: "/ Користувачі / nemrow / SITM / folder1 / folder2"


1
Зверніть увагу, що робочий каталог не повинен відповідати фактичному файлу. Отже, Dir.pwdі ваша пропозиція може потенційно відрізнятися.
Бесі

4

Якщо ви хочете отримати повний шлях до каталогу поточного файлу rb:

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

3

Завдяки цьому ви можете отримати абсолютний шлях до будь-якого файлу, що знаходиться в будь-якому каталозі.

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

Це повернеться

=> "/User/abc/xyz/some-dir/some-file-name"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.