оболочка встроена в pwd против / bin / pwd - PullRequest
1 голос
/ 28 июня 2010

Я хотел бы знать реализацию кода встроенных pwd и / bin / pwd, особенно когда путь к каталогу является символической ссылкой.

Пример:

hita@hita-laptop:/home$ ls -l
lrwxrwxrwx  1 root root   31 2010-06-13 15:35 my_shell -> /home/hita/shell_new/hita_shell

hita@hita-laptop:/home$ cd my_shell

hita@hita-laptop:/home/my_shell$ pwd <SHELL BUILT-IN PWD>  
/home/my_shell

hita@hita-laptop:/home/my_shell$ /bin/pwd  
/home/hita/shell_new/hita_shell

Вывод отличается в обоих случаях. Любая подсказка?

спасибо

Ответы [ 4 ]

3 голосов
/ 23 мая 2014

Ядро поддерживает текущий каталог (по индексу) и, когда вам нужен текущий каталог, оно определяет его имя, проходя вверх по дереву каталогов (используя ..), чтобы найти имена всех компонентов пути.Это «настоящий» или иногда называемый «физический» рабочий каталог.Есть библиотечная функция getcwd (3), которая делает это за вас;в более поздних системах Linux это фактически системный вызов, который помогает получить согласованное представление, если родительские каталоги находятся в процессе переименования.

Некоторые оболочки, особенно bash, поддерживают переменную среды PWD дляотслеживать, где вы находитесь, и если вы изменили каталог с помощью символической ссылки, эта переменная среды покажет это.Они называют это «логическим» путем.

/ bin / pwd показывает результат getcwd (3), то есть реальный путь;если вы дадите это -L, он скажет вам значение PWD (если это не мусор, тогда вы получите реальный путь).(Версия Gnu / bin / pwd выполняет больше работы, чем эта, чтобы справиться со сложностями родительских каталогов без разрешения на чтение и очень длинных имен путей.)

Встроенный в Bash pwd показывает «логический» путь с любымсимволические ссылки, которые вы использовали, чтобы попасть туда;даже если это теперь мусор (т.е. удален или переименован, так как вы использовали его).Значение по умолчанию для встроенного pwd можно изменить с помощью команды set -o Physical (on) или set + o Physical (off is plus!). Запрос по умолчанию (содержащий текущий каталог) также следует за параметром.

# make a directory with a symlink alias
cd /tmp
mkdir real
ln -s real sym
cd sym

pwd  # will say sym
pwd -L # will say sym
pwd -P # will say real
/bin/pwd  # will say real
/bin/pwd -L # will say sym
/bin/pwd -P # will say real

rm /tmp/sym
pwd  # says sym, though link no longer exists
/bin/pwd -L # will say real!

rmdir /tmp/real
pwd  # says sym, though no directory exists
/bin/pwd # says error, as there isn't one

Что бы это ни стоило, я считаю, что весь «логический» бизнес только добавляет путаницы;старый путь был лучшим.Это правда, что символические ссылки могут сбивать с толку, но это делает его более запутанным, потому что любые открывающиеся файловые операции ... не делают то же самое, что любые изменения в каталогах, которые используют .. например, в этом довольно неприятном примере:

mkdir -p /tmp/dir/subdir
ln -s /tmp/dir/subdir /tmp/a
cd /tmp/a
ls .. # shows contents of /tmp/dir
(cd .. ; ls) # shows contents of /tmp

Чтобы избежать всего этого, вы можете поместить следующее в ваш ~ / .bashrc -o физический

Надеюсь, что это поможет!

С уважением, J.

PS Вышесказанное довольно специфично для Linux и Gnu bash;другие оболочки и системы похожи, но отличаются.

2 голосов
/ 28 июня 2010

Преимущество встроенного в оболочку pwd заключается в том, что он может запомнить, как вы обращались к каталогу с символическими ссылками, поэтому он показывает вам эту информацию. Автономная утилита просто знает, каков ваш настоящий рабочий каталог, а не как вы перешли на этот каталог, поэтому она сообщает реальный путь.

Лично мне не нравятся оболочки, которые делают то, что вы описываете, потому что они показывают реальность, отличную от той, которую будут видеть автономные инструменты. Например, то, как встроенный инструмент анализирует относительный путь, будет отличаться от того, как автономный инструмент анализирует относительный путь.

1 голос
/ 28 июня 2010

Встроенный pwd по умолчанию показывает символические ссылки, но не будет работать, если вы укажете опцию -P.

Напротив, команда pwd не показывает символические ссылки по умолчанию, но будет отображаться, если задана опция -L.

1 голос
/ 28 июня 2010

Оболочка отслеживает в своей собственной памяти, что представляет из себя ваша директория currentct, объединяя ее с тем, что вы cd (и исключая записи . и ..).Это делается для того, чтобы символические ссылки не запутались cd ...Реализация /bin/pwd перемещает дерево каталогов вверх, пытаясь найти inode с правильными именами.

...