2009-12-21 3 views
218

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

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

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

Вопрос на самом деле не ясно: Вы хотите) текущий рабочий каталог (который является 'Dir.pwd') или вы хотите каталог, в котором в настоящее время запущен скрипт (который является 'File.dirname (__ FILE __)')? Представьте, что вы вызываете скрипт из другого места (например, 'ruby testdirectory/testscript.rb') здесь, они будут разными! – amenthes

+1

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

+4

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

ответ

160

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

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

+2

'Dir.pwd' эквивалентно 'pwd -P'.'exec ('pwd -L')' получит эквивалент pwd в терминале (pwd обычно является встроенным bash и не разрешает символические ссылки). –

+1

также обратите внимание на часто забытый класс Pathname: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html – awenkhh

+0

Существует проблема, Dir.pwd будет распечатайте рабочий каталог, в котором запускается скрипт, что может и не быть тем, что вы хотите. – Brandon

4

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

File.dirname(__FILE__) 

Пример:

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

результат: "/ Users/nemrow/SITM/папка1/folder2"

+0

Обратите внимание: рабочий каталог не должен совпадать с фактическим файлом. Так что 'Dir.pwd' и ваше предложение могут потенциально отличаться. – Besi

42

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

__dir__ 

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

File.dirname(__FILE__) 
+8

Интересно, почему непоследовательность, почему бы не '__DIR__'? – Zequez

+11

@Zequez Потому что ['__FILE__' является константой, но' __dir__' является методом] (http://stackoverflow.com/a/15190725/405017). – Phrogz

+0

это будет печатать рабочий каталог, где сценарий запускается, как сказал @Brandon. –

1

Если вы хотите, чтобы получить полный путь к каталогу текущего файла ПУЭ:

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

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

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

Это вернет

=> "/User/abc/xyz/some-dir/some-file-name" 
Смежные вопросы