Что такое $ PWD? (против текущего рабочего каталога)

27

Таким образом, Википедия ( ссылка ) говорит мне, что команда pwdявляется сокращением от «печать рабочего каталога», и это имеет смысл.

Но для переменной среды буква «P» должна быть аббревиатурой от чего-то другого, кроме print.

Я слышал, как люди говорили о «текущем рабочем каталоге», который звучит лучше и более интуитивно понятен, но переменная окружения, похоже, называется $ PWD, а не $ CWD. Никто никогда не говорит: «Вы проверяли переменную рабочего каталога печати?».

В настоящее время я играю с сервером веб-приложений uWSGI, и при запуске он сообщает мне (на странице статистики uWSGI):

"cwd":"/home/velle/greendrinks",

таким образом, им, очевидно, нравится (более интуитивный акроним) cwdболее pwd.

Я думаю, я пытаюсь выяснить, неправильно ли я что-то понял, или это просто вопрос присвоения переменной среды неинтуитивного имени?

Мадс Скьерн
источник
5
Настоящий рабочий каталог?
DarioP
3
Я подозреваю, что вы просто обдумываете это. $PWDэквивалентно `pwd`, и это было достаточно оправданием.
тот другой парень
1
Еще одна догадка: обрабатывать рабочий каталог?
oxfn

Ответы:

23

Это зависит от того, что вы делаете. Прежде всего, $PWDэто переменная окружения и pwdвстроенная оболочка или настоящий двоичный файл:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

Теперь встроенная команда bash просто напечатает текущее значение, $PWDесли вы не используете -Pфлаг. Как объяснено в help pwd:

pwd: pwd [-LP]

    Напечатайте имя текущего рабочего каталога.

    Опции:

      -L
          выведите значение $PWD if, если имя текущего рабочего каталога
      -P
          распечатать физический каталог без каких-либо символических ссылок

    По умолчанию pwd ведет себя так, как если бы был указан ключ -L.

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.

Источник /ubuntu//a/476633/291937

Thushi
источник
1
@llua Ничто не запрещает PWDбыть переменной среды. Это на самом деле случай по умолчанию с большинством, если не со всеми оболочками, и имеет смысл предоставить его дочерним процессам.
Jlliagre
1
Интересно, почему люди проголосовали, это похоже на хороший ответ и подробно объяснил.
Мадс Скьерн
2
@MadsSkjern Большинство встроенных функций требует, чтобы стандарт POSIX также был доступен в виде команд. Это позволяет вызывать их напрямую из других программ без необходимости запуска оболочки.
Jlliagre
2
Это на самом деле не отвечает на вопрос для меня. Вопрос на самом деле не в различиях между $PWDи pwd(которые уже были рассмотрены в U & L, прежде чем я верю), а в причинах, которые привели к присвоению имени переменной " PWD".
Джон У. С. Смит,
1
@ Thushi Вы, скорее всего, правы. PWD был представлен тем ksh88документом, в котором он был: PWD The present working directory set by the cd command.Вы должны добавить это в свой ответ.
Jlliagre
15

$ PWD является Р athname тока W orking D irectory

При наличии символьных ссылок результаты чтения $ PWD могут отличаться от выполнения команды pwd .

jcbermu
источник
Не могли бы вы привести пример того, как получить разные значения для $PWDи pwd?
Мадс Скьерн