Назад | Перейти на главную страницу

Символическая ссылка и sudo

Создаю символическую ссылку:

ln -s /tmp/folder1 /tmp/folder2

Затем я захожу в / tmp / folder2 и запускаю pwd:

$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part

Почему pwd с участием sudo дать исходный каталог? Я пишу сценарий bash и мне нужен абсолютный путь к текущему каталогу. С sudo я не могу получить исходный каталог.

В pwd это и встроенная оболочка, и / bin / pwd. В нормальных условиях встроенная команда будет запускаться вместо / bin / pwd. Команду pwd можно вызвать как pwd -L или pwd -P И встроенный, и / bin / pwd по умолчанию pwd -L со страницы руководства

-L, --logical использовать PWD из окружения, даже если он содержит символические ссылки

поэтому, когда вы запускаете pwd, вы фактически запускаете pwd -L, который фактически печатает $ PWD (если он существует). Когда ты бежишь sudo pwd, sudo предоставляет только те переменные среды, которые должны передаваться через env_keep директивы. PWD обычно отсутствует в этом списке, поэтому sudo pwd должен определить, где он находится, и в действительности запускается как pwd -P

-P, --physical исключить все символические ссылки

Способ решения проблемы - использовать pwd -P если вы постоянно хотите, чтобы путь к физическому каталогу или (как говорит @Felix) добавлял PWD в список переменных среды, которые нужно сохранить, с помощью директивы env_keep в sudoers

env_keep += "PWD"  

В баше pwd является встроенным. /bin/pwd дает то же поведение, что и sudo pwd.

Вы захотите

  1. использовать sudo pwd -L, который работает, только если вы
  2. включают Defaults env_keep=PWD в твоем sudoers файл