como obter o caminho absoluto do diretório de trabalho atual do irb


273

Estou executando o Ruby no Windows, embora não saiba se isso deve fazer a diferença. Tudo o que quero fazer é obter o caminho absoluto do diretório de trabalho atual. Isso é possível no irb? Aparentemente, a partir de um script, é possível usarFile.expand_path(__FILE__)

Mas, do irb, tentei o seguinte e recebi o erro "Permissão negada":

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

10
A questão não é clara: Deseja a) o diretório de trabalho atual (que é Dir.pwd) ou o diretório em que o script atualmente em execução está localizado (qual é File.dirname(__FILE__))? Imagine chamar um script de qualquer outro lugar (como ruby testdirectory/testscript.rb) aqui, os dois serão diferentes!
Amenthes

1
@amenthes Você alega que minha pergunta não está clara e pergunta "Deseja a) o diretório de trabalho atual ...." e minha pergunta diz "Tudo o que quero fazer é obter o caminho absoluto do diretório de trabalho atual ...". O que não está claro?
Dexygen

7
não está claro por causa da frase "Aparentemente, é possível usar um script File.expand_path(__FILE__)" - porque __FILE__a localização de um animal é diferente do diretório de trabalho atual (que é Dir.pwd).
amenthes

2
@amenthes eu pensei que fez um bom trabalho muito diferenciar "do IRB", que é ali mesmo no título da pergunta (e duas vezes dentro da própria pergunta), a partir "de um script"
Dexygen

Respostas:


515

Dir.pwd parece fazer o truque.

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


4
Já faz quase 10 anos, mas ainda assim, obrigado por esta resposta.
Nick Schwaderer

1
Nota: isso não retorna a localização do arquivo atual. Para fazer isso, veja as respostas abaixo. Isso retorna apenas o diretório de trabalho atual do shell que está chamando o script (exatamente como pwd), que pode estar em algum lugar completamente diferente daquele em que o arquivo de script está localizado.
GDP2

186

File.expand_path File.dirname(__FILE__) retornará o diretório relativo ao arquivo do qual este comando é chamado.

Mas Dir.pwdretorna o diretório ativo (resultados idênticos aos da execução pwdno seu terminal)


3
Dir.pwdé equivalente a pwd -P. exec('pwd -L')obterá o equivalente a pwd no terminal (o pwd normalmente é um bash embutido e não resolve os links simbólicos).
Barry Kelly

1
por favor, tome também um olhar para a classe Pathname muitas vezes esquecido: ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html
awenkhh

1
Há um problema, o Dir.pwd imprime o diretório de trabalho de onde o script é executado - o que pode não ser o que você deseja.
Brandon

Sim, supondo que você execute o comando bundle exec rspec specno diretório '/ project', enquanto no arquivo 'spec / spec_helper.rb', o valor de Dir.pwdainda será '/ project'.
hiveer


6

Isso fornecerá o diretório de trabalho do arquivo atual.

File.dirname(__FILE__)

Exemplo:

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

resultado: "/ Usuários / nemrow / SITM / folder1 / folder2"


1
Observe que o diretório de trabalho não deve ser o mesmo que o arquivo real. Então, Dir.pwde sua sugestão pode ser potencialmente diferente.
Besi

4

Se você deseja obter o caminho completo do diretório do arquivo rb atual:

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

3

Com isso, você pode obter o caminho absoluto de qualquer arquivo localizado em qualquer diretório.

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

Isso retornará

=> "/User/abc/xyz/some-dir/some-file-name"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.