Odpowiedzi:
To zależy od tego, co robisz. Przede wszystkim $PWDjest zmienną środowiskową i pwdjest wbudowaną powłoką lub rzeczywistym plikiem binarnym:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
Teraz wbudowane bash wypisze po prostu bieżącą wartość, $PWDchyba że użyjesz -Pflagi. Jak wyjaśniono w help pwd:
pwd: pwd [-LP]
Print the name of the current working directory.
Options:
-L print the value of $PWD if it names the current working
directory
-P print the physical directory, without any symbolic links
By default, `pwd' behaves as if `-L' were specified.
pwdBinarny, z drugiej strony, staje się aktualny katalog poprzez getcwd(3)wywołanie systemowe która zwraca taką samą wartość jak readlink -f /proc/self/cwd. Aby to zilustrować, spróbuj przejść do katalogu, który jest linkiem do innego:
$ ls -l
total 4
drwxr-xr-x 2 terdon terdon 4096 Jun 4 11:22 foo
lrwxrwxrwx 1 terdon terdon 4 Jun 4 11:22 linktofoo -> foo/
$ cd linktofoo
$ echo $PWD
/home/terdon/foo/linktofoo
$ pwd
/home/terdon/foo/linktofoo
$ /bin/pwd
/home/terdon/foo/foo
Podsumowując, w systemach GNU (takich jak Ubuntu) pwdi echo $PWDsą równoważne, chyba że użyjesz tej -Popcji, ale /bin/pwdjest inna i zachowuje się jak pwd -P.
Oba zwrócą ten sam wynik, jeśli użyjesz ich bez opcji dla wszystkich działających katalogów, w tym w przypadku dowiązań symbolicznych.
Jednak z man pwd:
-P, --physical
avoid all symlinks
Oznaczałoby to wykonanie, pwd -Pgdy w dowiązaniach symbolicznych, które wskazują na niektóre inne katalogi, wydrukuje ścieżkę do oryginalnego katalogu.
Na przykład, jeśli masz dowiązanie symboliczne, /var/runktóre wskazuje /runi znajdujesz się w /var/run/katalogu, wykonywanie
echo $PWD
wróci:
/var/run
i będzie to samo dla pwd. Jeśli jednak wykonasz:
pwd -P
wróci
/run
Zatem zależy to od ścieżki, której potrzebujesz: rzeczywista ścieżka bez dowiązań symbolicznych lub obecny katalog ignorujący dowiązania symboliczne. Jedyna różnica między pwd -Pi echo $PWDwystępuje, gdy istnieją dowiązania symboliczne.