Ответы:
Это зависит от того, что вы делаете. Прежде всего, $PWDэто переменная окружения, pwdвстроенная оболочка или реальный двоичный файл:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
Теперь встроенная команда bash просто напечатает текущее значение, $PWDесли вы не используете -Pфлаг. Как объяснено в 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.
pwdДвоичный, с другой стороны, получает текущий каталог через getcwd(3)системный вызов , который возвращает то же значение readlink -f /proc/self/cwd. Для иллюстрации попробуйте перейти в каталог, который является ссылкой на другой:
$ 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
Итак, в заключение, на системах GNU (таких как Ubuntu), pwdи echo $PWDони эквивалентны, если вы не используете -Pопцию, но /bin/pwdотличается и ведет себя как pwd -P.
Оба будут возвращать один и тот же результат, если вы используете их без параметров для всех рабочих каталогов, в том числе в символьных ссылках.
Однако из man pwd:
-P, --physical
avoid all symlinks
Это будет означать выполнение, pwd -Pкогда в символических ссылках, которые указывают на некоторые другие каталоги, будет напечатан путь к исходному каталогу.
Например, если у вас есть символическая ссылка, /var/runкоторая указывает на, /runи вы находитесь в /var/run/каталоге, выполните
echo $PWD
вернусь:
/var/run
и будет таким же pwd. Однако, если вы выполните:
pwd -P
вернусь
/run
Таким образом, это зависит от того, какой путь вам требуется: фактический путь без символических ссылок или текущий каталог, игнорирующий символические ссылки. Единственная разница между pwd -Pи echo $PWDкогда есть символические ссылки.