come ottenere il percorso assoluto della directory di lavoro corrente da irb


273

Sto eseguendo Ruby su Windows anche se non so se ciò dovrebbe fare la differenza. Tutto quello che voglio fare è ottenere il percorso assoluto della directory di lavoro corrente. Questo è possibile da IRB? Apparentemente da uno script è possibile usareFile.expand_path(__FILE__)

Ma da irb ho provato quanto segue e ho ricevuto un errore "Autorizzazione negata":

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

10
La domanda in realtà non è chiara: vuoi a) la directory di lavoro corrente (che è Dir.pwd) o vuoi la directory in cui si trova lo script attualmente in esecuzione (che è File.dirname(__FILE__))? Immagina di chiamare una sceneggiatura da qualsiasi altra parte (come ruby testdirectory/testscript.rb) qui, i due saranno diversi!
amenthes,

1
@amenthes Sostieni che la mia domanda non è chiara e poi chiedi "Vuoi a) la directory di lavoro corrente ...." e la mia domanda afferma "Tutto quello che voglio fare è ottenere il percorso assoluto della directory di lavoro corrente ...". Cosa non è chiaro?
Dexygen,

7
non è chiaro a causa della frase "Apparentemente da uno script è possibile usare File.expand_path(__FILE__)" - perché __FILE__la posizione è un animale diverso dalla directory di lavoro corrente (che è Dir.pwd).
amenthes,

2
@amenthes Pensavo di aver fatto un buon lavoro differenziando "da irb" che è proprio lì nel titolo della domanda (e due volte all'interno della domanda stessa), da "da una sceneggiatura"
Dexygen

Risposte:


515

Dir.pwd sembra fare il trucco.

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


4
Sono passati quasi 10 anni, ma comunque, grazie per questa risposta.
Nick Schwaderer,

1
Nota: questo non restituisce la posizione del file corrente. Per fare ciò, vedere le risposte di seguito. Questo restituisce solo la directory di lavoro corrente della shell che chiama lo script (proprio come pwd), che potrebbe essere in qualche posto completamente diverso da dove si trova il file di script.
PIL2

186

File.expand_path File.dirname(__FILE__) restituirà la directory relativa al file da cui viene chiamato questo comando.

Ma Dir.pwdrestituisce la directory di lavoro (risultati identici a eseguire pwdnel terminale)


3
Dir.pwdè equivalente a pwd -P. exec('pwd -L')otterrà l'equivalente di pwd nel terminale (pwd è normalmente un built-in bash e non risolve i collegamenti simbolici).
Barry Kelly,

1
per favore dai un'occhiata anche alla classe Pathname
awenkhh

1
C'è un problema, Dir.pwd stamperà la directory di lavoro in cui viene eseguito lo script, che potrebbe non essere quello che desideri.
Brandon,

Sì, supponendo che tu esegua il comando bundle exec rspec specnella directory '/ project', mentre nel file 'spec / spec_helper.rb', il valore di Dir.pwdsarà ancora '/ project'.
hiveer

59

Per quanto riguarda il percorso relativo all'attuale script in esecuzione, da Ruby 2.0 puoi anche usare

__dir__

Quindi questo è fondamentalmente lo stesso di

File.dirname(__FILE__)


questo stamperà la directory di lavoro in cui viene eseguito lo script come ha detto @Brandon.
aldrien.h,

6

Questo ti darà la directory di lavoro del file corrente.

File.dirname(__FILE__)

Esempio:

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

risultato: "/ Users / nemrow / SITM / cartella1 / cartella2"


1
Si noti che la directory di lavoro non deve essere uguale al file effettivo. Quindi Dir.pwde il tuo suggerimento potrebbe potenzialmente differire.
Besi,

4

Se si desidera ottenere il percorso completo della directory del file rb corrente:

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

3

Attraverso questo è possibile ottenere il percorso assoluto di qualsiasi file situato in qualsiasi directory.

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

Questo tornerà

=> "/User/abc/xyz/some-dir/some-file-name"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.