Załóżmy, że mam folder:
cd /home/cpm135/public_html
i stworzyć dowiązanie symboliczne
ln -s /var/lib/class .
Później jestem w tym katalogu:
cd /home/cpm135/public_html/class
To pwd
powie mi, że jestem w środku/home/cpm135/public_html/class
Czy jest jakiś sposób, aby wiedzieć, że jestem „naprawdę” /var/lib/class
? Dzięki
shell
symlink
cd-command
working-directory
Oliver Williams
źródło
źródło
fish
powłoka automatycznie rozpoznaje dowiązanie symboliczne po przejściucd
do niego.Odpowiedzi:
W zależności od
pwd
konfiguracji polecenia może domyślnie wyświetlać logiczny katalog roboczy (wyjście przezpwd -L
), który pokazywałby lokalizację dowiązania symbolicznego, lub fizyczny katalog roboczy (wyjście przezpwd -P
), który ignoruje dowiązanie symboliczne i pokazuje „prawdziwy” katalog.Aby uzyskać pełne informacje, możesz to zrobić
Wewnątrz dowiązania symbolicznego nastąpi powrót
źródło
-P
flaga była tym, czego potrzebowałem. Dziękitest "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(lub wymienić&& echo No symlinks
z|| echo Symlinks
).file "$(pwd)"
działa tylko wtedy, gdy dowiązanie symboliczne jest ostatnim składnikiem katalogu. Po wykryciu CD nie wykrywa dowiązania symbolicznego OP/home/cpm135/public_html/class/foo/bar
. Nie znam niczego, co wyświetla informacje o wszystkich dowiązaniach symbolicznych w nazwie ścieżki, ale możesz także użyćrealpath .
, co moim zdaniem jest równoważnepwd -P
Zauważ, że
pwd
tak naprawdę jest to wbudowana powłoka. W zależności od powłoki i jej konfiguracji wyniki mogą ulec zmianie. Aby uzyskać bardziej przenośne rozwiązanie, powinieneś użyć/bin/pwd
. Fragment ze strony podręcznika:Zasadniczo można rozwiązać pełną ścieżkę kanoniczną dowolnego pliku / katalogu, używając
readlink -f
.readlink -f .
działa podobnie dopwd -P
.źródło
readlink -f
nie jest dostępna we wszystkich Uniksach (np. Niedostępna w OS-X)Naprawdę jesteś
/home/cpm135/public_html/class
- to jedyna poprawna odpowiedź na pytanie „jaki jest mój bieżący katalog roboczy”.Kiedy odnosisz się do
/var/lib/class
... to tak naprawdę nie chodzi o to, gdzie jesteś, ale o to, jaką ścieżkę się tam dostałeś .Po uruchomieniu
/bin/pwd
oblicza bieżący katalog roboczy, patrząc na. i .. katalogi (wymienione na górzels -la
), określające, który katalog w .. pasuje do. a następnie pracując wstecz do ... i. odnoszą się do tego samego katalogu. Po wykonaniu tego wszystkiego wie, jaki jest twój bieżący katalog roboczy.Kiedy uruchomisz
pwd
wbudowaną powłokę, nie postępuje ona zgodnie z tą procedurą (choć może zrobić to w razie potrzeby) - zamiast tego pamięta ścieżkę, którą podjąłeś, aby się tu dostać. Tak więc za każdym razem, gdy wykonujeszcd
polecenie, twoja powłoka zapamiętuje to jako część ścieżki, aby dostać się tam, gdzie jesteś teraz, ipwd
wypisuje to, co oblicza na podstawie wszystkichcd
wykonanych poleceń - które mogą, ale nie muszą, być twoje katalog roboczy.Sprawy mogą stać się naprawdę dziwne, kiedy wykonujesz a
ln -s . foo
i ciąglecd
przechodzisz do foo -/bin/pwd
powiesz, że wciąż jesteś w tym samym katalogu, ale wbudowana powłokapwd
powie, że jesteś/foo/foo/foo/foo/foo/foo
- nawet jeśli takiego katalogu nawet nie ma. (To powiedziawszy - prawdopodobnie potrafiszcd
.)Innym źródłem nieporozumień jest zmiana nazw katalogów.
/bin/pwd
natychmiast przejmie zmianę, ale wbudowanepwd
nie zrobi tego, dopóki nie zrobisz czegoś, co powie, że stara nazwa katalogu nie ma znaczenia.źródło
pwd
wbudowanym powłoką/bin/pwd
i wyjaśnienia, w jaki sposób wersja autonomiczna dostarcza bardziej przydatnych informacji (które mogą odpowiedzieć na oryginalne pytanie).-P
i-L
opcji wymienionych w innych odpowiedziach. Krótko mówiąc, niektóre implementacje są ustawione domyślnie na jedną, niektóre na drugą. W systemie Centos, który mam pod ręką, wbudowane bash domyślnie logiczne i/bin/pwd
domyślne fizycznie, ale oba akceptują obie opcje wiersza poleceń i zgadzają się na wynik, gdy zostaną podane.ls ..
pokaże zawartość/var/lib
, a nie/home/cpm135/public_html
.cd ..
jest wyjątkowy: powłoka wykonuje specjalne śledzenie „jak się tam dostałeś” i w rzeczywistości nie wykonujechdir("..")
wywołania systemowego. Jeśli chodzi o jądro, bieżący katalog roboczy powłoki (/proc/self/cwd
) jest tylko parą mountpoint: i-węzeł. To jest jak deskryptor otwartego pliku w katalogu, dlatego zmiana nazwy katalogu nie psuje powłoki. (cd .
aby zaktualizować$PWD
zmienną powłoki ). Robisz użyteczny punkt, więc głosuję za tym, kiedy zostanie naprawionyZasadniczo pytasz, czy istnieje rzeczywista ścieżka do bieżącego katalogu roboczego. Jest z pythonem i
os.getcwd()
funkcjąTo, co widzisz poniżej, to mały test z katalogu „VirtualBox VMs” znajdującego się w moim katalogu domowym. W rzeczywistości jest to dowiązanie symboliczne do innego katalogu znajdującego się na innym dysku twardym, zamontowanego w
/mnt/HDD
.Jak widać, python
os.getcwd()
rozwiązuje prawdziwą ścieżkę katalogu, a nie ścieżkę dowiązania symbolicznego.źródło