Разница в использовании между pwd и $ PWD

9

Для печати текущего / текущего рабочего каталога доступны переменная окружения $PWD и команда pwd . Итак, в чем разница в использовании обоих? или что нужно выбрать для конкретной цели?

Pandya
источник

Ответы:

10

Это зависит от того, что вы делаете. Прежде всего, $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.

terdon
источник
Одно из отличий состоит в том, что использование $ PWD, когда оно доступно, позволит избежать разветвления подкоманды, например echo или pwd. Это делает его выгодным для производительности и отслеживания программ.
Джо Ацбергер
3

Оба будут возвращать один и тот же результат, если вы используете их без параметров для всех рабочих каталогов, в том числе в символьных ссылках.

Однако из 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когда есть символические ссылки.

Jobin
источник