Proces może przesłuchać system plików w celu ustalenia jego bieżącego katalogu roboczego, używając metody, która jest zbyt skomplikowana, aby być na ten temat jako odpowiedź na to pytanie. To właśnie robią pwd
program i getcwd
funkcja biblioteki. Na początku Uniksa były to jedyne sposoby, aby dowiedzieć się, jaki był twój katalog roboczy. Oto część odpowiedzi na twoje pytanie, której nie mogę znaleźć w żadnej innej odpowiedzi ani w żadnym innym miejscu na tej stronie (po 42 sekundach wyszukiwania):
- Kiedy powłoka się uruchamia, pobiera bieżący katalog roboczy (prawdopodobnie przez wywołanie
getcwd
).
Następnie, za każdym razem, gdy wykonujesz a cd
, pushd
lub popd
, powłoka śledzi katalog roboczy za pomocą funkcji manipulacji ciągami. Na przykład,
- Jeśli twój katalog roboczy jest
/home/sim
i ty wpiszesz cd ..
, powłoka obliczy, że katalogiem roboczym jest /home
.
- Jeśli twój katalog roboczy jest
/home/sim
i ty wpiszesz cd .
, powłoka obliczy, że twój katalog roboczy jest nadal /home/sim
.
- Jeśli twój katalog roboczy jest
/home/sim
i wpiszesz cd aa
, powłoka obliczy, że katalog roboczy jest /home/sim/aa
- bez sprawdzania, czy aa
jest dowiązaniem symbolicznym.
Robi to, aby zaoszczędzić na „kosztach” połączeń getcwd
. Jest to jednak kompromis, ponieważ może prowadzić do niepoprawnych informacji.
- Polecenie
pwd
(wbudowane) wyświetla po prostu zapamiętane / obliczone przez powłokę pojęcie katalogu roboczego.
- Ponadto powłoka umieszcza zapamiętane / obliczone pojęcie katalogu roboczego w zmiennej środowiskowej PWD, dla wygody procesów użytkownika. Proces nigdy nie powinien na tym polegać, jeśli potrzebuje dokładnych informacji.
Najważniejsze jest to, że powłoka może się mylić, gdzie się znajduje. Ale jeśli wpiszesz /bin/pwd
, uruchomi się to w osobnym procesie, który nie ma dostępu do pojęcia powłoki o tym, czym jest katalog roboczy, a więc określa prawdziwy katalog roboczy w staromodny sposób. (Wyjątek: /bin/pwd
program może spojrzeć na zmienną środowiskową PWD i najwyraźniej robi to po określeniu -L
.) Oto inny przykład tego, jak powłoka może się mylić:
cd /home/sim/aa #
Załóżmy, że /home
, /home/sim
i /home/sim/aa
#
wszystkie są prawdziwymi katalogami (nie symbolicznymi linkami).
pwd #
Dane wyjściowe:, /home/sim/aa
które są poprawne.
mv ../aa ../bb
pwd #
Dane wyjściowe:, /home/sim/aa
co jest niepoprawne.
/bin/pwd #
Dane wyjściowe:, /home/sim/bb
które są poprawne.
I tylko w przypadku, gdy nie jesteśmy pewni na to, jeśli wpiszesz ln -s . aa
i cd aa
, wówczas aktualny katalog roboczy nie zmieniła , nie bardziej niż to robi po wpisaniu cd .
- dlatego, że to, co robisz, gdy wpiszesz w istocie cd aa
.