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

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

Но с irb я попробовал следующее и получил ошибку «Permission denied»:

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

person Dexygen    schedule 21.12.2009    source источник
comment
На самом деле вопрос не ясен: хотите ли вы: а) текущий рабочий каталог (это Dir.pwd) или каталог, в котором находится текущий скрипт (это File.dirname(__FILE__))? Представьте, что здесь вызывается скрипт из любого другого места (например, ruby testdirectory/testscript.rb), они будут разными!   -  person amenthes    schedule 23.03.2015
comment
@amenthes Вы утверждаете, что мой вопрос неясен, а затем спрашиваете, хотите ли вы: а) текущий рабочий каталог .... и в моем вопросе указано все, что я хочу сделать, это получить абсолютный путь к текущему рабочему каталогу .. .. Что непонятно?   -  person Dexygen    schedule 19.07.2015
comment
это неясно из-за предложения. Судя по сценарию, можно использовать File.expand_path(__FILE__), потому что местоположение __FILE__ отличается от текущего рабочего каталога (это Dir.pwd).   -  person amenthes    schedule 19.07.2015
comment
@amenthes Я думал, что неплохо поработал, отличаясь от irb, который указан прямо в заголовке вопроса (и дважды в самом вопросе), от сценария   -  person Dexygen    schedule 19.07.2015
comment
Причина, по которой вопрос неясен, заключается в том, что даже в скрипте File.expand_path(__FILE__) не получает абсолютный путь к текущему рабочему каталогу.   -  person Ken Williams    schedule 02.07.2021


Ответы (6)


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

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

person user85509    schedule 21.12.2009
comment
Примечание: это не возвращает местоположение текущего файла. Для этого см. Ответы ниже. Это возвращает только текущий рабочий каталог оболочки, которая вызывает скрипт (точно так же, как pwd), который может быть где-то совершенно отличным от того, где находится файл скрипта. - person GDP2; 18.02.2020
comment
@ GDP2 Он делает ТОЧНО то, что я просил: получить абсолютный путь к текущему рабочему каталогу. - person Dexygen; 11.10.2020
comment
@Dexygen Это нормально для тебя. У меня был другой сценарий использования, поэтому я сделал заметку для себя и всех, кто может столкнуться с той же проблемой. Как видно из голосов за ответ ниже, есть почти 200 других (по крайней мере), у которых также была такая же проблема. - person GDP2; 11.10.2020

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

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

person Psylone    schedule 26.09.2011
comment
Dir.pwd эквивалентно pwd -P. exec('pwd -L') получит эквивалент pwd в терминале (pwd обычно является встроенным в bash и не разрешает символические ссылки). - person Barry Kelly; 26.01.2014
comment
также обратите внимание на часто забываемый класс Pathname: ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html - person awenkhh; 27.06.2014
comment
Возникла проблема, Dir.pwd распечатает рабочий каталог, в котором запущен скрипт, что может быть не тем, что вам нужно. - person Brandon; 14.10.2014
comment
Да, при условии, что вы запускаете команду bundle exec rspec spec в каталоге '/ project', а в файле 'spec / spec_helper.rb' значение Dir.pwd по-прежнему будет '/ project'. - person hiveer; 27.03.2018

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

__dir__

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

File.dirname(__FILE__)
person udo    schedule 19.03.2015
comment
@Zequez Потому что __FILE__ - константа, а __dir__ - метод. - person Phrogz; 03.01.2016
comment
это напечатает рабочий каталог, в котором запускается скрипт, как сказал @Brandon. - person aldrien.h; 03.06.2016

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

File.dirname(__FILE__)

Пример:

текущий_файл: "/Users/nemrow/SITM/folder1/folder2/amazon.rb"

результат: "/ Users / nemrow / SITM / folder1 / folder2"

person Jordan Rumpelstiltskin Nemrow    schedule 14.07.2014
comment
Обратите внимание, что рабочий каталог не должен совпадать с фактическим файлом. Итак, Dir.pwd и ваше предложение потенциально могут отличаться. - person Besi; 02.02.2015

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

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

Это вернет

=> "/User/abc/xyz/some-dir/some-file-name"
person yeshwant singh    schedule 06.03.2017

Если вы хотите получить полный путь к каталогу текущего rb файла:

File.expand_path('../', __FILE__)
person Châu Hồng Lĩnh    schedule 06.10.2016