как получить абсолютный путь текущего рабочего каталога от irb

273

Я использую Ruby на Windows, хотя я не знаю, должно ли это иметь значение. Все, что я хочу сделать, это получить абсолютный путь текущего рабочего каталога. Это возможно от IRB? Как видно из скрипта можно использоватьFile.expand_path(__FILE__)

Но из irb я попробовал следующее и получил ошибку «Отказано в доступе»:

File.new(Dir.new(".").path).expand
Dexygen
источник
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

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

File.expand_path File.dirname(__FILE__) вернет каталог относительно файла, из которого вызывается эта команда.

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

Psylone
источник
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__)
Châu Hồng Lĩnh
источник
3

Благодаря этому вы можете получить абсолютный путь к любому файлу, расположенному в любом каталоге.

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

Это вернется

=> "/User/abc/xyz/some-dir/some-file-name"
да, хочу сингх
источник