wie man den absoluten Pfad des aktuellen Arbeitsverzeichnisses von irb erhält

273

Ich verwende Ruby unter Windows, obwohl ich nicht weiß, ob das einen Unterschied machen sollte. Ich möchte nur den absoluten Pfad des aktuellen Arbeitsverzeichnisses abrufen. Ist das von irb aus möglich? Anscheinend ist es aus einem Skript möglichFile.expand_path(__FILE__)

Aber von irb habe ich Folgendes versucht und einen Fehler "Berechtigung verweigert" erhalten:

File.new(Dir.new(".").path).expand
Sauerstoff
quelle
10
Die Frage ist eigentlich nicht klar: Möchten Sie a) das aktuelle Arbeitsverzeichnis (welches ist Dir.pwd) oder möchten Sie das Verzeichnis, in dem sich das aktuell ausgeführte Skript befindet (welches ist File.dirname(__FILE__))? Stellen Sie sich vor, Sie rufen ein Skript von irgendwo anders (wie ruby testdirectory/testscript.rb) hier auf, die beiden werden unterschiedlich sein!
Amenthes
1
@amenthes Sie behaupten, meine Frage sei unklar und fragen dann "Wollen Sie a) das aktuelle Arbeitsverzeichnis ..." und meine Frage lautet "Ich möchte nur den absoluten Pfad des aktuellen Arbeitsverzeichnisses ermitteln ...". Was ist unklar?
Dexygen
7
Es ist unklar wegen des Satzes "Anscheinend ist es aus einem Skript möglich, es zu verwenden File.expand_path(__FILE__)" - weil sein __FILE__Standort ein anderes Tier ist als das aktuelle Arbeitsverzeichnis (das heißt Dir.pwd).
Amenthes
2
@amenthes Ich dachte, ich habe einen ziemlich guten Job gemacht, indem ich "von irb", das genau dort im Titel der Frage steht (und zweimal in der Frage selbst), von "von einem Skript"
Dexygen

Antworten:

515

Dir.pwd scheint den Trick zu tun.

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

user85509
quelle
4
Es ist fast 10 Jahre her, aber trotzdem, danke für diese Antwort.
Nick Schwaderer
1
Hinweis: Dies gibt nicht den Speicherort der aktuellen Datei zurück. Lesen Sie dazu die Antworten unten. Dies gibt nur das aktuelle Arbeitsverzeichnis der Shell zurück, die das Skript aufruft (genau wie pwd). Dies kann sich an einem völlig anderen Ort befinden als der Ort, an dem sich die Skriptdatei befindet.
BIP2
186

File.expand_path File.dirname(__FILE__) gibt das Verzeichnis relativ zu der Datei zurück, aus der dieser Befehl aufgerufen wird.

Aber Dir.pwdkehren das Arbeitsverzeichnis (Ergebnisse identisch mit der Ausführung pwdin Ihrem Terminal)

Psylone
quelle
3
Dir.pwdist äquivalent zu pwd -P. exec('pwd -L')wird das Äquivalent von pwd im Terminal erhalten (pwd ist normalerweise eine eingebaute Bash und löst keine symbolischen Links auf).
Barry Kelly
1
Bitte werfen Sie auch einen Blick auf die oft vergessene Pathname-Klasse: ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html
awenkhh
1
Es gibt ein Problem. Dir.pwd druckt das Arbeitsverzeichnis, in dem das Skript ausgeführt wird - möglicherweise nicht das, was Sie möchten.
Brandon
Ja, vorausgesetzt, Sie führen den Befehl bundle exec rspec specim Verzeichnis '/ project' aus, während in der Datei 'spec / spec_helper.rb' der Wert von Dir.pwdweiterhin '/ project' lautet .
Hiveer
59

Was den Pfad relativ zum aktuell ausgeführten Skript betrifft, können Sie seit Ruby 2.0 auch verwenden

__dir__

Das ist also im Grunde das gleiche wie

File.dirname(__FILE__)
Du tust
quelle
Dadurch wird das Arbeitsverzeichnis gedruckt, in dem das Skript ausgeführt wird, wie @Brandon sagte.
aldrien.h
6

Dadurch erhalten Sie das Arbeitsverzeichnis der aktuellen Datei.

File.dirname(__FILE__)

Beispiel:

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

Ergebnis: "/ Users / nemrow / SITM / folder1 / folder2"

Jordan Rumpelstilzchen Nemrow
quelle
1
Bitte beachten Sie, dass das Arbeitsverzeichnis nicht mit der tatsächlichen Datei identisch sein darf. Also Dir.pwdund Ihr Vorschlag könnte möglicherweise abweichen.
Besi
4

Wenn Sie den vollständigen Pfad des Verzeichnisses der aktuellen rb-Datei abrufen möchten:

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

Auf diese Weise können Sie den absoluten Pfad jeder Datei in einem beliebigen Verzeichnis abrufen.

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

Dies wird zurückkehren

=> "/User/abc/xyz/some-dir/some-file-name"
Yeshwant Singh
quelle