pwd bez dowiązań symbolicznych

54

Jeśli to zrobię pwd, zauważę, że używa wszelkich dowiązań symbolicznych, których użyłem, aby dostać się do bieżącego katalogu. Czy mogę uzyskać informację, że mam „prawdziwy” katalog, w którym się znajduję… tzn. Ścieżkę z katalogu głównego do mojego bieżącego katalogu bez użycia jakichkolwiek dowiązań symbolicznych?

JoelFan
źródło

Odpowiedzi:

70

Według strony podręcznika POSIX dla pwdtej -Popcji może być przydatna:

-P Bezwzględna zapisana nazwa ścieżki nie może zawierać nazw plików, które w kontekście nazwy ścieżki odnoszą się do plików typu dowiązanie symboliczne.

A zatem

$ pwd -P

powinno być tym, czego potrzebujesz.

Steven D.
źródło
Chciałbym man pwdzauważyć, że informacje te można łatwo znaleźć, wpisując polecenie shell w celu znalezienia opcji dla tego polecenia.
Chud37
7

Wbudowana powłoka pwd korzysta ze ścieżki, którą powłoka śledzi, kiedy użytkownik cd(i przechowuje ją $PWD). Oznacza to, że jeśli masz dowiązanie symboliczne do złożonej (głębokiej) ścieżki, powie ci, co wpisałeś, aby przejść do tego katalogu zamiast prawdziwej ścieżki. Robi się to, aby zapewnić ci to, czego chcesz przez większość czasu.

/bin/pwdkorzysta z getcwdwywołania systemowego (które w dzisiejszych czasach jest wywołaniem bibliotecznym, czytającym /proc/self/cwd), które zwraca ścieżkę kanoniczną dla bieżącego katalogu, przeszukuje wszystkie przejścia dowiązań symbolicznych.

Jak zauważył Steven D., pwdma -Pmożliwość zignorowania $PWD. Ma również -Lopcję zwrócenia zawartości $PWD. Strona pwdpodręcznika dla nie mówi, która opcja jest używana domyślnie, ale doświadczenie mówi mi, że powyższy opis jest poprawny (shell pwdvs. /bin/pwd). Jednak prawdopodobnie nie powinieneś na tym polegać i po prostu użyć pwd -P.

camh
źródło
2
Opisujesz zachowanie w systemach Linux, gdzie /bin/pwdjest GNU, pwdgdy POSIXLY_CORRECT nie jest ustawiony. W systemach POSIX, w których pwdznajduje się /bin. /bin/pwdużyje $ PWD i może zwrócić ścieżki z dowiązaniami symbolicznymi. GNU pwd będzie zachowywać się w ten sposób POSIX, gdy znajdzie zmienną POSIXLY_CORRECT w swoim środowisku.
Stéphane Chazelas,