jak uzyskać absolutną ścieżkę bieżącego katalogu roboczego z irb

273

Używam Ruby na Windowsie, choć nie wiem, czy to powinno coś zmienić. Chcę tylko uzyskać ścieżkę bezwzględną bieżącego katalogu roboczego. Czy to jest możliwe z IRB? Najwyraźniej ze skryptu jest to możliweFile.expand_path(__FILE__)

Ale z irb wypróbowałem następujące i otrzymałem błąd „Odmowa zezwolenia”:

File.new(Dir.new(".").path).expand
Dexygen
źródło
10
Pytanie nie jest do końca jasne: czy chcesz a) bieżący katalog roboczy (który jest Dir.pwd), czy też katalog, w którym znajduje się aktualnie uruchomiony skrypt (który jest File.dirname(__FILE__))? Wyobraź sobie, że wywołujesz skrypt skądkolwiek (jak ruby testdirectory/testscript.rb) tutaj, oba będą różne!
amenthes
1
@amenthes Twierdzisz, że moje pytanie jest niejasne, a następnie pytasz „Czy chcesz a) bieżący katalog roboczy ....”, a moje pytanie brzmi: „Chcę tylko uzyskać ścieżkę bezwzględną bieżącego katalogu roboczego ...”. Co jest niejasne?
Dexygen
7
jest niejasne ze względu na zdanie „Najwyraźniej ze skryptu można go używać File.expand_path(__FILE__)” - ponieważ __FILE__lokalizacja jest innym zwierzęciem niż aktualny działający katalog (który jest Dir.pwd).
amenthes
2
@amenthes Myślałem, że wykonałem całkiem dobrą robotę, odróżniając „od irb”, co jest dokładnie w tytule pytania (i dwukrotnie w samym pytaniu), od „ze skryptu”
Dexygen

Odpowiedzi:

515

Dir.pwd wydaje się załatwić sprawę.

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

użytkownik85509
źródło
4
Minęło prawie 10 lat, ale dziękuję za tę odpowiedź.
Nick Schwaderer
1
Uwaga: nie zwraca położenia bieżącego pliku. Aby to zrobić, zobacz odpowiedzi poniżej. Zwraca to tylko bieżący katalog roboczy powłoki, która wywołuje skrypt (podobnie jak pwd), co może być zupełnie inne niż miejsce, w którym znajduje się plik skryptu.
GDP2
186

File.expand_path File.dirname(__FILE__) zwróci katalog względem pliku, z którego to polecenie jest wywoływane.

Ale Dir.pwdzwraca katalog roboczy (wyniki identyczne jak pwdw twoim terminalu)

Psylon
źródło
3
Dir.pwdjest równoważne z pwd -P. exec('pwd -L')otrzyma odpowiednik pwd w terminalu (pwd jest zwykle wbudowanym bashem i nie rozpoznaje dowiązań symbolicznych).
Barry Kelly
1
spójrz także na często zapomnianą klasę Pathname
awenkhh
1
Wystąpił problem: Dir.pwd wydrukuje katalog roboczy, w którym skrypt jest uruchamiany - co może nie być tym, czego chcesz.
Brandon
Tak, przy założeniu, że uruchomisz komendę bundle exec rspec specw katalogu „/ project”, natomiast w pliku „spec / spec_helper.rb” wartość Dir.pwdnadal będzie wynosić „/ project”.
hiveer
59

Jeśli chodzi o ścieżkę względem bieżącego skryptu wykonawczego, od Ruby 2.0 możesz także użyć

__dir__

Jest to w zasadzie to samo co

File.dirname(__FILE__)
udo
źródło
14
@Zequez Ponieważ __FILE__jest stałą, ale __dir__jest metodą .
Phrogz
spowoduje to wydrukowanie katalogu roboczego, w którym skrypt jest uruchamiany, jak powiedział @Brandon.
aldrien.h
6

To da ci katalog roboczy bieżącego pliku.

File.dirname(__FILE__)

Przykład:

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

wynik: „/ Users / nemrow / SITM / folder1 / folder2”

Jordan Rumpelstiltskin Nemrow
źródło
1
Pamiętaj, że katalog roboczy nie może być taki sam jak rzeczywisty plik. Więc Dir.pwdi swoją moc sugestia potencjalnie różnią.
Besi
4

Jeśli chcesz uzyskać pełną ścieżkę do katalogu bieżącego pliku rb:

File.expand_path('../', __FILE__)
Châu Hồng Lĩnh
źródło
3

Dzięki temu można uzyskać bezwzględną ścieżkę do dowolnego pliku znajdującego się w dowolnym katalogu.

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

To wróci

=> "/User/abc/xyz/some-dir/some-file-name"
yeshwant singh
źródło