как получить абсолютный путь текущего рабочего каталога от 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здесь), оба будут разными!
amenthes

1
@amenthes Вы утверждаете, что мой вопрос неясен, а затем спрашиваете «Хотите ли вы: а) текущий рабочий каталог…», и мой вопрос гласит «Все, что я хочу сделать, это получить абсолютный путь текущего рабочего каталога ...». Что неясно?
Кислород

7
это неясно из-за предложения «Очевидно, из сценария, который возможно использовать File.expand_path(__FILE__)» - потому что __FILE__местоположение отличается от текущего рабочего каталога (который есть Dir.pwd).
amenthes

2
@amenthes Я думал, что неплохо справился, отличая «от irb», что прямо в названии вопроса (и дважды в самом вопросе), от «из сценария»
Dexygen

Ответы:


515

Dir.pwd кажется, добивается цели.

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


4
Прошло уже почти 10 лет, но все же, спасибо за этот ответ.
Ник

1
Примечание: это не возвращает местоположение текущего файла. Для этого смотрите ответы ниже. Это только возвращает текущий рабочий каталог оболочки, которая вызывает скрипт (точно так же как pwd), который может быть где-то совершенно отличным от того, где находится файл скрипта.
GDP2

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».
Hiveer

59

Что касается пути относительно текущего исполняемого скрипта, то с Ruby 2.0 вы также можете использовать

__dir__

Так что это в основном так же, как

File.dirname(__FILE__)


это напечатает рабочий каталог, где выполняется скрипт, как сказал @Brandon.
aldrien.h

6

Это даст вам рабочий каталог текущего файла.

File.dirname(__FILE__)

Пример:

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

результат: "/ Users / 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.