В чем разница между встроенной в Unix командой `pwd` и ее переменной окружения $ PWD? - PullRequest
3 голосов
/ 06 декабря 2010

Вот случай.У меня есть вызов в каталоге: -% / home / myname /

Я сделал мягкую ссылку в этом каталоге: -% cd / home / myname /% ln -s / home / others /.

Теперь я перехожу на другие / from / home / myname / Вот интересная часть.

Когда я выполнил встроенную команду unix pwd, я получил ОРИГИНАЛЬНОЕ имя пути: -% / home/ others /

Но когда я повторяю переменную среды $ PWD, я получаю имя пути ссылки: -% / home / myname / others /

Почему это так?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010
/var# ls -l
lrwxrwxrwx  1 root root   10 Aug 22 13:21 mail -> spool/mail
drwxr-xr-x  2 root root 4096 Jul  1 20:58 opt
drwxr-xr-x 22 root root 4096 Dec  5 17:38 run
drwxr-xr-x 12 root root 4096 Aug 22 13:21 spool
drwxrwxrwt 14 root root 4096 Dec  6 02:46 tmp
/var# cd mail
/var/mail# echo $PWD
/var/mail

/var/mail# pwd
/var/mail

/var/mail# /bin/pwd
/var/spool/mail

Другими словами, достаточно использовать $PWD, поскольку pwd может не дать вам лучших результатов (для любого определения лучше).

Почему это так?/bin/pwd использует специфичные для ОС вызовы для определения текущего рабочего каталога - и в случае Linux ядро ​​сохраняет только разрешенный каталог (см. /proc/self/cwd), тогда как в pwds оболочки содержится то, что, по мнению оболочки, находится.

2 голосов
/ 06 декабря 2010

Разница между внешней командой /bin/pwd и встроенной заключается в том, что внешняя команда не знает, какой набор операций cd доставил вас туда, и поэтому не делает вид, что ваш текущий каталог находится где-то внизу. цепочка символических ссылок; он дает вам прямой путь от корневого каталога к вашему текущему каталогу, скорее как функция realpath().

См. set -o physical в bash.

...