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
Dexygen
fonte
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

user85509
fonte
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)

Psylone
fonte
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
59

Quanto ao caminho relativo ao script em execução atual, desde o Ruby 2.0 você também pode usar

__dir__

Então isso é basicamente o mesmo que

File.dirname(__FILE__)
udo
fonte
isso imprimirá o diretório de trabalho em que o script é executado, como disse o @Brandon.
precisa saber é o seguinte
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"

Jordan Rumpelstiltskin Nemrow
fonte
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__)
Châu Hồng Lĩnh
fonte
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"
yeshwant singh
fonte