comment obtenir le chemin absolu du répertoire de travail actuel depuis irb

273

J'exécute Ruby sur Windows mais je ne sais pas si cela devrait faire une différence. Tout ce que je veux faire, c'est obtenir le chemin absolu du répertoire de travail actuel. Est-ce possible avec irb? Apparemment, à partir d'un script, il est possible d'utiliserFile.expand_path(__FILE__)

Mais d'irb, j'ai essayé ce qui suit et j'ai obtenu une erreur "Autorisation refusée":

File.new(Dir.new(".").path).expand
Dexygen
la source
10
La question n'est pas vraiment claire: voulez-vous a) le répertoire de travail actuel (qui est Dir.pwd) ou voulez-vous le répertoire où se trouve le script en cours d'exécution (qui est File.dirname(__FILE__))? Imaginez appeler un script de n'importe où ailleurs (comme ruby testdirectory/testscript.rb) ici, les deux seront différents!
amenthes
1
@amenthes Vous prétendez que ma question n'est pas claire et demandez ensuite "Voulez-vous a) le répertoire de travail actuel ...." et ma question dit "Tout ce que je veux faire est d'obtenir le chemin absolu du répertoire de travail actuel ...". Qu'est-ce qui n'est pas clair?
Dexygen
7
ce n'est pas clair à cause de la phrase "Apparemment, à partir d'un script, il est possible d'utiliser File.expand_path(__FILE__)" - parce que __FILE__l'emplacement est un animal différent du répertoire de travail actuel (qui est Dir.pwd).
amenthes
2
@amenthes Je pensais avoir fait un assez bon travail en différenciant "de irb" qui est juste là dans le titre de la question (et deux fois dans la question elle-même), de "à partir d'un script"
Dexygen

Réponses:

515

Dir.pwd semble faire l'affaire.

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

user85509
la source
4
Cela fait presque 10 ans, mais encore, merci pour cette réponse.
Nick Schwaderer
1
Remarque: cela ne renvoie pas l'emplacement du fichier actuel. Pour ce faire, consultez les réponses ci-dessous. Cela ne renvoie que le répertoire de travail actuel du shell qui appelle le script (comme pwd), qui pourrait être quelque part complètement différent de celui où se trouve le fichier de script.
GDP2
186

File.expand_path File.dirname(__FILE__) renverra le répertoire relatif au fichier à partir duquel cette commande est appelée.

Mais Dir.pwdretourne le répertoire de travail (résultats identiques à l'exécution pwddans votre terminal)

Psylone
la source
3
Dir.pwdest équivalent à pwd -P. exec('pwd -L')obtiendra l'équivalent de pwd dans le terminal (pwd est normalement un code bash intégré, et ne résout pas les liens symboliques).
Barry Kelly
1
jetez également un œil à la classe Pathname souvent oubliée: ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html
awenkhh
1
Il y a un problème, Dir.pwd imprimera le répertoire de travail où le script est exécuté - ce qui n'est peut-être pas ce que vous voulez.
Brandon
Oui, en supposant que vous exécutez la commande bundle exec rspec specdans le répertoire '/ project', tandis que dans le fichier 'spec / spec_helper.rb', la valeur de Dir.pwdsera toujours '/ project'.
ruche
59

En ce qui concerne le chemin relatif au script d'exécution en cours, depuis Ruby 2.0, vous pouvez également utiliser

__dir__

C'est donc essentiellement la même chose que

File.dirname(__FILE__)
tu fais
la source
cela affichera le répertoire de travail de l'endroit où le script est exécuté comme l'a dit @Brandon.
aldrien.h
6

Cela vous donnera le répertoire de travail du fichier actuel.

File.dirname(__FILE__)

Exemple:

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

résultat: "/ Users / nemrow / SITM / folder1 / folder2"

Jordan Rumpelstiltskin Nemrow
la source
1
Veuillez noter que le répertoire de travail ne doit pas être le même que le fichier réel. Donc Dir.pwd, votre suggestion peut potentiellement différer.
Besi
4

Si vous souhaitez obtenir le chemin complet du répertoire du fichier rb actuel:

File.expand_path('../', __FILE__)
Châu Hồng Lĩnh
la source
3

Grâce à cela, vous pouvez obtenir le chemin absolu de n'importe quel fichier situé dans n'importe quel répertoire.

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

Cela reviendra

=> "/User/abc/xyz/some-dir/some-file-name"
yeshwant singh
la source