Що таке $ PWD? (проти поточного робочого каталогу)


27

Тож у Вікіпедії ( посилання ) йдеться про те, що команда pwdє скороченою для "робочого каталогу друку", і це має сенс.

Але для змінної середовища "P" має бути абревіатурою для чогось іншого, ніж друку.

Я чую, як люди говорять про "поточний робочий каталог", який звучить краще і більш інтуїтивно зрозумілий, але все ж змінна середовище, здається, називається $ PWD, а не $ CWD. Ніхто ніколи не каже "Ви перевіряли змінну робочого каталогу друку?".

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

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

тому вони , очевидно , як (більш інтуїтивною абревіатура) cwdнад pwd.

Я думаю, я намагаюся зрозуміти, чи я щось неправильно зрозумів, чи це лише питання про те, щоб дати змінній середовища неінтуїтивне ім’я?


5
Чи існує поточний робочий каталог?
ДаріоП

3
Я підозрюю, що ти це просто переосмислив. $PWDрівнозначно `pwd`, і це було достатньо виправдання.
той інший хлопець

1
Ще одна здогадка: Process Working Directory?
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 якщо воно називає поточну робочу директорію
      -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


1
@llua Ніщо не забороняє PWDбути змінною середовища. Це насправді випадок за замовчуванням для більшості, якщо не всіх оболонок, і це має сенс надавати його дітям процесів.
jlliagre

1
Цікаво, чому люди зволікають, це здається гарною відповіддю і ретельно пояснено.
Mads Skjern

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 .


Чи можете ви навести приклад того, як отримати різні значення для $PWDта pwd?
Mads Skjern

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.