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

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


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)


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


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”


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__)

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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.